实战MySQL参数调优

567 阅读3分钟
原文链接: mp.weixin.qq.com

今天记录下参数调优,MySQL有几百个参数,一般情况下需要调整的并不多,而且不要为了调整而调整,很多参数和MySQL运行机制是有关的,但即使不了解内部机制也不妨碍调整。

由于InnoDB引擎是主流,所以MyISAM相关的参数就不要配置了,这也提示很多原来很多的参数调整不会有用。

1:innodb_buffer_pool_size

这个是最重要的参数,InnoDB引擎数据数据和索引尽量都放在内存中,对性能非常重要,理论上配置值为物理内存的70%。

innodb_buffer_pool_instances 主要是为了提升并发能力,称为pool实例。

2:innodb_log_file_size

redo logs配置的大小,对于数据恢复和写操作性能非常重要,这个值越大,checkpoint flush就越少,能够减少I/0操作,可以配置为1G,默认有两个文件,即总共2G。

3:innodb_file_per_table

建议打开,独立的表空间,这样InnoDB对于每个表会使用独立的.ibd和.frm,删除或清空表的时候还能回收空间。

4:innodb_flush_log_at_trx_commit

主库建议配置为1,这样每次都会flush log到磁盘中,安全性得到保证,而从库依赖于binlog,所以可以配置为2,这样性能更好。

5:innodb_log_buffer_size

事务提交的缓存区,默认为1M,如果有大字段,缓存区放不下,就会加大I/O压力,如果发现Innodb_log_waits status不为0,可以提高该参数值。

6:innodb_io_capacity

很重要的参数,如果设置的比较低,MySQL就会认为I/O能力不行,这个值能够控制每秒脏页的刷新数量。可以通过工具计算出磁盘I/O能力。

7:innodb_write_io_threads

控制有多少个线程能够写磁盘

8:innodb_adaptive_flushing

动态控制脏页刷新的速率。

9:sort_buffer_size

filesort排序buffer,对返回的结果在内存中进行排序,是会话级的配置,如果Sort_merge_passes status值增大,可以调整该参数。

10:join_buffer_size

index scans、range index scans、joins不能使用索引而要进行全表扫描需要配置的最小缓存大小。join的时候,每个连接会占用相同大小的内存。

11:max_heap_table_size和tmp_table_size

由于group操作,需要在内存中新建一个临时表,这两个参数就是控制size,建议配置为相同的值,注意观察Created_tmp_disk_tables、Created_tmp_tables两个status变量,如果增加比较快,需要调整这两个参数值。

12:table_open_cache

表打开缓存,所有连接线程共用这缓存,需要注意操作系统文件描述符大小限制(open_files_limit),如果opened_table增长的很快,可以加大该值,Innodb有自己的数据字典,作用不是很大,

13:table_definition_cache

表定义缓存,如果有很多表,可以增大该值。

14:max_connections

允许的最大连接数,如果Max_used_connections增长很快,需要调整该值,但也要评估MySQL能否支撑大量的连接。

15:thread_cache_size

客户端连接线程大小,Threads_created如果增长很快,可以调整该值,建议配置为8 + (max_connections / 100)

16:innodb_thread_concurrency

MySQL进入内核的并发能力,0表示不限制,如果有并发问题,可以调整为cpu核数 * 磁盘数 *2

参考:https://oracleblog.org/study-note/recommended-settings-for-mysql-5-6-5-7-server/#comments