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 找出未走索引或内存不足导致的临时表/排序