在 Ubuntu 上 MySQL 占用内存高,通常不是“内存泄漏”,而是 MySQL 本身设计就是吃内存的,再加上配置或业务因素。下面按常见原因 → 排查方法 → 解决建议说明。
MySQL 内存主要分为几块:
innodb_buffer_pool_size(默认可能很大)sort_buffer_sizejoin_buffer_sizeread_buffer_sizeinnodb_buffer_pool_size 设置过大(最常见)现象
查看
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
解释
建议
修改:
# /etc/mysql/mysql.conf.d/mysqld.cnf
innodb_buffer_pool_size = 1G
查看最大连接
SHOW VARIABLES LIKE 'max_connections';
SHOW STATUS LIKE 'Threads_connected';
问题
解决
常见于:
sort_buffer_size = 4M
join_buffer_size = 4M
如果 500 连接 × 4M = 2GB
✅ 推荐:
sort_buffer_size = 256K
join_buffer_size = 256K
查看
SHOW STATUS LIKE 'Created_tmp%';
如果:
Created_tmp_disk_tables 很高
说明:✅ 解决:
SELECT *GROUP BY / ORDER BY 大表Linux 会把 空闲内存当缓存
free -h
看 available,不是 free
✅ MySQL 占用高但系统不卡 = 正常
# MySQL 进程内存
ps aux | grep mysqld
# 当前连接
mysql -e "SHOW PROCESSLIST;"
# 缓冲池大小
mysql -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"
[mysqld]
innodb_buffer_pool_size = 512M
max_connections = 100
sort_buffer_size = 256K
join_buffer_size = 256K
tmp_table_size = 64M
max_heap_table_size = 64M
Ubuntu 上 MySQL 内存高,90% 是因为
innodb_buffer_pool_size大或连接多,这是设计行为,不是故障。
如果你愿意,可以把:
free -hSHOW VARIABLES LIKE '%buffer%';SHOW STATUS LIKE 'Threads%';贴出来,我可以帮你 精确算内存占用是否合理。