今天记录下参数调优,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