天天看点

性能调优之 mysql 体系化调优

1、架构层面调优

 1)、主从复制:(读写分离)

 2)、集群模式

 3)、分库分表:

  A、分库:把db分为按分布式来划分几个db来执行

  B、分表:

   B1 、水平分表:一年的数据量大,就按月份来分表

    B2、垂直分表:一个表的有流水号,存放图片,其中存放图片的字段超大,这时可以把图片字段切分出来,形成一个新的表。(二进制文件,例如图片视频,都是存放路径)

2、参数调优

 1)、参数查看常用命令:

A、show global status;  查询mysql服务器运行各种状态值

B、 show variables;查询mysql服务器配置信息

C、 日志信息:show variables like 'log_%'      show master logs;   show master status;

2)、查看连接数:

 Show variables like 'max_connections';

 Show global status like 'max_used_connections';   *****   max_used_connections/max_connections =0.85   ************

修改连接数:set GLOBAL max_connections=2000;(根据并发数来做相应的调整)

  3)、表扫描:

 Show global status like 'handler_read_rnd_next';

 Show global status like 'com_select';

 表扫描率:handler_read_rnd_next/com_select < 4000 ;如果超过 4000 ,说明进行了太多的表扫描,很有可能是索引没建好。增加 read_buffer_size 大小会有改善,但是不能超过8M.

4)、日志相关:Show variables like 'innodb_flush_log_at_trx_commit';

参数类型

0:log thread每隔1秒钟会将log buffer中的数据写入到文件,同时还会通知文件系统进行文件同步的flush操作,保证数据确实已经写入到了磁盘上面的物理文件。(高性能)

1:每次事务的结束都会触发log thread将Log buffer中的数据写入文件,并通知文件系统同步文件。最终没有存入磁盘。(最安全,性能差)

 2:log thread会在每次事务结束的时候将数据写入事务日志,但是这里仅仅是调用了文件系统的文件写入操作,文件系统什么时候会将缓存中的数据同步到物理磁盘文件,log thread完全不知道。(对数据一致性和完整性要求不高)

  innodb_flush_log_at_trx_commit = 0,Innodb 中的Log Thread 没隔1 秒钟会将log buffer中的数据写入到文件,同时还会通知文件系统进行文件同步的flush 操作,保证数据确实已经写入到磁盘上面的物理文件。但是,每次事务的结束(commit 或者是rollback)并不会触发Log Thread 将log buffer 中的数据写入文件。所以,当设置为0 的时候,当MySQL Crash 和OS Crash 或者主机断电之后,最极端的情况是丢失1 秒时间的数据变更。

innodb_flush_log_at_trx_commit = 1,这也是Innodb 的默认设置。我们每次事务的结束都会触发Log Thread 将log buffer 中的数据写入文件并通知文件系统同步文件。这个设置是最安全的设置,能够保证不论是MySQL Crash 还是OS Crash 或者是主机断电都不会丢失任何已经提交的数据。

innodb_flush_log_at_trx_commit = 2,当我们设置为2 的时候,Log Thread 会在我们每次事务结束的时候将数据写入事务日志,但是这里的写入仅仅是调用了文件系统的文件写入操作。而我们的文件系统都是有缓存机制的,所以Log Thread 的这个写入并不能保证内容真的已经写入到物理磁盘上面完成持久化的动作。文件系统什么时候会将缓存中的这个数据同步到物理磁盘文件Log Thread 就完全不知道了。所以,当设置为2 的时候,MySQL Crash 并不会造成数据的丢失,但是OS Crash 或者是主机断电后可能丢失的数据量就完全控制在文件系统上了。各种文件系统对于自己缓存的刷新机制各不一样,大家可以自行参阅相关的手册。

根据上面三种参数值的说明,0的时候,如果mysql crash可能会丢失数据,可靠性不高。我们着重测试1和2两种情况。

查看每个日志文件大小参数: Show variables like 'innodb_log_file_size';  一般设置为 64-512M

 5)、超时设置:

查看超时设置:

Show variables like ‘wait_timeout’;

Show variables like ‘interactive_timeout’;

  A、修改配置  

    vi /etc/my.cnf  

 [mysqld]  

         wait_timeout=10  

     启动 mysql 命令

 # /etc/init.d/mysqld restart       /etc/init.d/mysql restart

 或  service mysqld restart         service mysql restart

B、直接用sql命令行修改 (因为线上服务不能进行随便重启,故建议采用方式 2 )

mysql> set global wait_timeout=10;  

mysql> show global variables like 'wait_timeout';  

3、sql语句调优  

看是否开启慢查询:show varibles like '%quer%';

1)、慢查询

2)、explain  (参考作者写的mysql执行计划分享​​https://blog.51cto.com/u_14103476/2518490​​)

4、查询缓存(query cache):缓存查询一般在生产环境是关闭的,查询缓存仅仅是对 myisam 表的索引数据有效,innodb 有自己的缓存(innodb_buffer_pool_size )。

innodb_buffer_pool_size

作用:

这个参数主要作用是缓存innodb表的索引,数据,插入数据时的缓冲

默认值:128M

专用mysql服务器设置的大小: 操作系统内存的70%-80%最佳。

设置方法:

my.cnf文件

innodb_buffer_pool_size = 6G