Linux 上 MySQL 占用内存“高”是非常常见且通常正常的现象,关键要看你指的“高”是多少、以及是不是真的异常。下面按原因分类 + 排查方法 + 优化建议来说明。
MySQL 的设计理念是:能缓存就缓存,减少磁盘 IO。
这是最大的一块内存占用。
✅ 正常表现:
mysqld 占用内存 ≈ buffer pool 大小
查看:
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
每个连接都会占用内存:
SHOW STATUS LIKE 'Threads_connected';
SHOW VARIABLES LIKE 'max_connections';
⚠️ 问题场景:
innodb_buffer_pool_size = 4G # 但机器只有 4G
➡ 系统 + MySQL 一起 OOM
✅ 建议:
innodb_buffer_pool_size = 物理内存的 50%~70%
以下参数过大也会吃内存:
sort_buffer_size
join_buffer_size
read_buffer_size
read_rnd_buffer_size
⚠️ 如果这些是“每连接”的,连接一多就爆。
✅ 建议:
例如:
查看慢查询:
SHOW PROCESSLIST;
或开启慢日志。
✅ 解决:
free -h
你会看到:
used 很高
buff/cache 很高
✅ MySQL 用的内存 ≠ 系统快撑不住
ps -eo pid,comm,rss | grep mysqld
或:
SELECT * FROM sys.memory_global_total;
✅ 正常:
❌ 异常:
innodb_buffer_pool_size = 4G
max_connections = 200
sort_buffer_size = 2M
join_buffer_size = 2M
你可以贴出:
free -hmy.cnf 配置我可以直接告诉你:到底是正常,还是该调。