MySQL参数优化的选项

一些能够带来最大性能收益的参数调整

1. 调整InnoDB缓冲区

InnoDB是MySQL启动后使用最多的引擎,分配一个足够大的缓冲区能够最大程度上提升MySQL性能。最佳比例控制在机器内存的70~75%左右,比如一台服务器的内存为32GB,将innodb_buffer_pool_size = 22938M(23GB)左右最合理。

InnoDB缓冲区空间大于1GB时,会自动将缓冲区划分为多个实例空间,好处在于:多线程并发执行时,可以减少并发冲突。MySQL官方的建议是每个缓冲区实例必须大于1GB,如果机器内存较小时,例如8/16GB,可以指定为1GB,但是机器内存够大时,达到了32GB/64GB甚至更高,可以适当将每个缓冲区实例调整到2GB左右。

比如现在假设缓冲区共计拥有40GB内存,哪设置将缓冲区实例设置为innodb_buffer_pool_instances = 20个比较合适。

2. 调整工作线程的缓冲区

可以调大sort_buffer、read_buffer、join_buffer几个区域,属于线程私有区域,每条线程都拥有这些区域:

  • sort_buffer_size:排序缓冲区大小,影响group by、order by...等排序操作。
  • read_buffer_size:读取缓冲区大小,影响select...查询操作的性能。
  • join_buffer_size:联查缓冲区大小,影响join多表联查的性能。

这些区域根据机器内存设置1~2倍MB,4G内存将其调整为4/8MB,控制在64MB以下。线程每执行完一条SQL就会释放这些区域,没必要调整的太大。

还可以调整一个参数:max_length_for_sort_data ,这个参数关乎着MySQL排序的方式,排序字段值的最大长度小于该值,会将所有要排序的字段值载入内存排序,但如果大于该值时,则会一批一批的加载排序字段值进内存,然后一边加载一边做排序。第一种效率更高,可以适当调大该参数的值,具体根据业务来做选择,或者交给MySQL自己控制。

3. 调整临时表空间

可以调整tmp_table_size、max_heap_table_size,这两个参数主要是限制临时表可用的内存空间 ,当创建的临时表空间占用超过tmp_table_size时,就会将其他新创建的临时表转到磁盘中创建,十分违背创建临时表加快查询速度的设计初衷。

参数的大小根据show global status like 'created_tmp%'; 的统计信息来决定,用统计出来的信息:Created_tmp_disk_tables / Created_tmp_tables * 100% = 120%,达到这个标准就比较合适,调整这个区域的值需要反复重启MySQL以及压测,比较费时间,在项目中很少使用临时表,也可以不关心这块参数的调整。

4. 调整空闲线程的存活时间

对于MySQL最大连接数无需做过多控制,客户端连接池那边做了调整即可,可以通过下述命令查看数据库连接的峰值:

  • show global status like 'Max_used_connections';

一般在客户端做了连接数控制后,这个峰值都会在客户端最大连接数的范围之内,对于数据库连接唯一需要稍微调整的即是空闲连接的超时时间 ,即wait_timeout、interactive_timeout ,这**两个参数必须一同设置,**否则不会生效,MySQL内部默认为8小时,也就是一个连接断开后,默认也会将对应的工作线程缓存八小时后再销毁,可以手动调整成30min~1h左右,让无用的连接能及时释放,减少资源的占用。

相关推荐
敬业小码哥6 分钟前
记一次:mysql的json及json数组使用组合使用
数据库·mysql·json
练小杰1 小时前
【Mysql-installer-community-8.0.26.0】Mysql 社区版(8.0.26.0) 在Window 系统的默认安装配置
数据库·sql·mysql·adb·配置文件·mysql安装·关系型数据库
Lris-KK1 小时前
【Leetcode】高频SQL基础题--1164.指定日期的产品价格
sql·leetcode
陈陈爱java2 小时前
Spring八股文
开发语言·javascript·数据库
拾忆,想起2 小时前
Redis复制延迟全解析:从毫秒到秒级的优化实战指南
java·开发语言·数据库·redis·后端·缓存·性能优化
爬山算法3 小时前
Redis(47)如何配置Redis哨兵?
数据库·redis·bootstrap
感哥3 小时前
MySQL多表查询
mysql
十八旬4 小时前
苍穹外卖项目实战(day-5完整版)-记录实战教程及问题的解决方法
java·开发语言·spring boot·redis·mysql
青鱼入云5 小时前
java面试中经常会问到的mysql问题有哪些(基础版)
java·mysql·面试
送秋三十五5 小时前
MySQL DBA需要掌握的 7 个问题
数据库·mysql·dba