MySQL内存调优关键在于按负载合理分配,重点是innodb_buffer_pool_size设为物理内存50%–75%(专机)或更低(共存服务),命中率应>95%,并合理控制max_connections、sort_buffer_size、tmp_table_size等参数,8.0起已移除查询缓存。

MySQL内存配置直接影响查询速度、并发能力和系统稳定性,关键不是堆大内存,而是按实际负载分配给最耗资源的组件。
重点调优 innodb_buffer_pool_size
InnoDB 缓冲池是 MySQL 最核心的内存区域,用于缓存数据页和索引页。若服务器专跑 MySQL,建议设为物理内存的 50%–75%;若还运行其他服务(如应用、Redis),需预留足够空间,避免系统频繁 swap。
- 查看当前设置:SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
- 观察命中率是否健康:SHOW STATUS LIKE 'Innodb_buffer_pool_read%'; 计算公式为 (1 - Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests) × 100%,理想值应 >95%
- 动态调整(8.0+ 支持在线扩容):SET GLOBAL innodb_buffer_pool_size = 4294967296;(即 4G),但重启后失效,需同步写入 my.cnf
合理控制连接与排序内存
每个客户端连接都会占用独立内存,大量短连接或复杂排序/临时表操作容易引发 OOM。
- max_connections:不要盲目调高。先查峰值连接数:SHOW STATUS LIKE 'Threads_connected'; 和历史监控,设为略高于峰值即可
- sort_buffer_size 和 read_buffer_size:按需设置,非全局越大越好。建议单连接值 256K–2M,高并发场景宁可稍低,避免总内存失控
- tmp_table_size 和 max_heap_table_size:两者需一致,控制内存临时表上限。超过则自动转磁盘临时表(慢)。一般设为 64M–256M,视最大 JOIN 结果集估算
别忽略 query_cache(已弃用但需知其影响)
MySQL 8.0 已彻底移除查询缓存(query_cache_type=0),5.7 及更早版本若开启,反而可能因锁争用拖慢高并发写入。除非读远大于写且 SQL 高度重复,否则建议关闭:
- 确认状态:SHOW VARIABLES LIKE 'query_cache_type';
- 若为 ON,建议在 my.cnf 中显式设为 query_cache_type = 0 并重启
监控与验证调优效果
改完参数不验证等于白调。重点关注三项指标:
- 内存使用是否稳定:free -h 或 top 观察可用内存及 swap 使用率
- InnoDB 缓冲池效率:Innodb_buffer_pool_hit_rate 持续低于 90%?说明 buffer 不够或存在大量全表扫描
- 慢查询是否减少:slow_query_log = ON + long_query_time = 1,定期分析 slow log 找出未走索引或内存不足导致的临时表/排序











