在 CentOS 上 MySQL 占用内存高 是非常常见的现象,通常不是“内存泄漏”,而是 MySQL 本身的设计机制。下面按「常见原因 → 排查方法 → 优化建议」给你系统说明。
这是最常见、最正常的内存占用来源。
innodb_buffer_pool_size 用来缓存:
例如:
innodb_buffer_pool_size = 2G
那 MySQL 会长期占用 2G 左右内存
✅ 这是性能优化,不是异常
每个连接都会占用内存:
例如:
max_connections = 500
即使只有 50 个连接,也可能预留大量内存
以下情况会瞬时拉高内存:
ORDER BY / GROUP BY 大表MyISAM 会:
✅ 现在基本都用 InnoDB
Linux 会:
你可以用:
free -h
看 available,不是 used
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
SHOW STATUS LIKE 'Innodb_buffer_pool%';
SHOW PROCESSLIST;
ps aux | grep mysqld
top
htop
例如:
✅ 建议:
innodb_buffer_pool_size = 内存 * 0.6~0.7
CentOS 默认 MySQL(或 MariaDB):
SHOW STATUS LIKE 'Created_tmp%';
如果:
Created_tmp_disk_tables 很高[mysqld]
innodb_buffer_pool_size = 1G # 根据内存调整
max_connections = 100
wait_timeout = 300
query_cache_type = 0
query_cache_size = 0
SELECT *以下情况才算异常:
那可能是:
你可以贴出:
free -hmy.cnf我可以直接告诉你:该不该降内存、怎么降、降多少。