mysql升级到8.0之后,不少运维和开发都遇到过这样一个现象:之前跑得好好的实例,升级完没怎么改配置,内存占用却涨了一大截,轻则swap开始波动,重则被系统杀掉进程。要处理这个问题,得先弄清楚mysql 8.0在内存使用上和旧版到底差在哪,再针对性地去调。

为什么mysql 8.0更容易占用更多内存
mysql 8.0在架构上做了不少改动,一些默认行为会直接推高内存:
- innodb_buffer_pool_size在8.0里如果机器内存较大,会自动按实例数拆分,并且默认值相对宽裕;
- 新增了更多内部临时表缓存和字典缓存,数据字典全内存化;
- 默认开启的性能监控相关结构也会吃掉一部分常驻内存。
先看清内存到底被谁吃了
可以通过mysql自带的视图粗略看各模块占用:
SELECT event_name, sum(current_number_of_bytes_used) AS mem FROM performance_schema.memory_summary_global_by_event_name ORDER BY mem DESC LIMIT 10;
另外在系统层用ps或者top看常驻集大小,再结合下面参数判断是否属于预期内。
关键参数优化建议
1. 控制innodb_buffer_pool_size
这是大头。如果机器内存8G、还跑着别的程序,别让它默认占掉一半以上:
[mysqld] innodb_buffer_pool_size = 2G innodb_buffer_pool_instances = 2
2. 限制连接与会话内存
每个连接都有排序、连接缓冲,数量太多会放大占用:
max_connections = 100 sort_buffer_size = 256K join_buffer_size = 256K read_buffer_size = 128K
3. 关掉用不上的特性
如果不需要资源组或者某些监控,可关闭以减少常驻开销:
SET GLOBAL performance_schema = OFF;
注意该操作需评估对排查能力的影响,生产环境谨慎使用。
用一张表总结常用调整项
| 参数 | 作用 | 建议 |
|---|---|---|
| innodb_buffer_pool_size | innodb缓存池 | 物理内存50%内且留足系统余量 |
| max_connections | 最大连接数 | 按业务并发压测得出 |
| performance_schema | 性能采集 | 非必要可关 |
小结
mysql升级后内存占用增加并不是bug,而是8.0把更多资源留给性能。只要理清innodb_buffer_pool_size与连接缓存的分配,关掉冗余特性,就能把内存管理回到可控状态。调整前记得在测试环境用真实负载验证,避免直接上生产引发性能回落。
mysqlmysql_8.0memory_optimization修改时间:2026-07-26 10:54:19