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左右,让无用的连接能及时释放,减少资源的占用。

相关推荐
KmSH8umpK9 分钟前
Redis分布式锁进阶第十二篇
数据库·redis·分布式
hERS EOUS14 分钟前
MySQL 函数
数据库·mysql
gQ85v10Db40 分钟前
Redis分布式锁进阶第十六篇:番外高阶避坑篇 + 隐性埋点锁故障深挖 + 疑难杂症终极兜底方案
数据库·redis·分布式
S1998_1997111609•X1 小时前
论恶意注入污染蜜罐进程函数值取仺⺋以集团犯罪获取数据爬虫的轮系依据
网络·数据库·爬虫·网络协议·百度
许彰午1 小时前
# 从OOM到根治的完整过程——导出大数据的应急、根因分析与游标方案
java·大数据·数据库·系统架构
eLIN TECE1 小时前
nacos2.3.0 接入pgsql或其他数据库
数据库
曾几何时`1 小时前
MySQL(七)索引
数据库·mysql
KmSH8umpK2 小时前
Redis分布式锁从原生手写到Redisson高阶落地,附线上死锁复盘优化方案进阶第九篇
数据库·redis·分布式
悠悠121382 小时前
一条 SQL 从敲下回车,到在 MySQL 里“跑完一生”,中间到底经历了啥?
数据库·sql·mysql
秋92 小时前
MySQL 9.7.0 使用详解:新特性、实战与避坑指南
android·数据库·mysql