🗣 Wd提问: MySQL占用内存高
🤖 Ai回答: MySQL 占用内存高,通常是因为配置文件中给各类缓存、连接池、日志缓冲等分配的总量超过了服务器物理内存,或者某些参数设置不合理。下面给出排查思路与调优步骤,按“先看现象 → 再查配置 → 最后动手改”的顺序进行。
1、先确认“高”到什么程度
• 用 `top` / `htop` / `ps -o pid,vsz,rss,comm -p $(pidof mysqld)` 查看 mysqld 进程的常驻内存 (RSS)。
• 用 `free -m`、`cat /proc/meminfo` 看系统整体内存。
• 如果 mysqld 的 RSS 接近或超过物理内存的 70~80%,就要着手调优。
2、用 MySQL 自带的“内存计算器”
MySQL 5.7/8.0 都支持 `performance_schema`,可直接统计内存分配:
sql
1、确认已开启
SHOW VARIABLES LIKE 'performance_schema';
2、统计当前总占用(字节)
SELECT
SUM(CURRENT_NUMBER_OF_BYTES_USED) AS total_bytes,
ROUND(SUM(CURRENT_NUMBER_OF_BYTES_USED)/1024/1024, 2) AS total_mb
FROM performance_schema.memory_summary_global_by_event_name;
3、看明细(按内存类型)
SELECT
EVENT_NAME,
CURRENT_NUMBER_OF_BYTES_USED/1024/1024 AS MB_used
FROM performance_schema.memory_summary_global_by_event_name
ORDER BY MB_used DESC
LIMIT 10;
常见的大头:
`memory/innodb/buf_buf_pool`(Buffer Pool)
`memory/sql/Prepared_statement::main_mem_root`(预处理语句)
`memory/innodb/log_buffer`(Redo Log Buffer)
`memory/performance_schema/`(PFS 本身)
3、估算理论最大值
MySQL 官方脚本 `mysqltuner.pl` 会帮你算:
bash
wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl
perl mysqltuner.pl host 127.0.0.1 user root pass xxxx
输出里会给出“Maximum possible memory usage”一行,如果超过物理内存,就继续往下调。
4、重点参数逐项检查
(1) InnoDB Buffer Pool(最大头)
公式:innodb_buffer_pool_size ≈ 70% * (物理内存 系统保留)
例:8 GB 机器,系统保留 1 GB,则设 5 GB 左右即可。
ini
[mysqld]
innodb_buffer_pool_size = 5G
(2) 每个连接的“线程缓存”
读/排序/连接缓冲加起来 ≈
read_buffer_size + read_rnd_buffer_size + sort_buffer_size + join_buffer_size + binlog_cache_size + tmp_table_size
乘以 `max_connections`,就是潜在峰值。
经验:
• `max_connections` 不要设得过高(除非真有 1000+ 并发)。
• 把单个会话缓冲改小,例如:
ini
max_connections = 200
read_buffer_size = 256K
read_rnd_buffer_size = 512K
sort_buffer_size = 256K
join_buffer_size = 256K
tmp_table_size = 16M
max_heap_table_size = 16M
(3) Performance Schema
如果不需要详细监控,可以关闭或缩小:
ini
performance_schema = OFF
或者只保留部分表
performance_schema_instrument = 'wait/%=OFF'
(4) 查询缓存(QC)
MySQL 5.7 默认开启,8.0 已废弃。若仍在 5.7 且命中率低,直接关闭:
ini
query_cache_type = 0
query_cache_size = 0
(5) Aria / MyISAM Key Cache
如果表全是 InnoDB,可把 `key_buffer_size` 调到 32M 甚至 0:
ini
key_buffer_size = 32M
5、动态验证
改完 `my.cnf` 后,先不重启,用 `SET GLOBAL` 在线调整部分参数(如 `innodb_buffer_pool_size` 在 5.7+ 支持动态修改),观察 RSS 是否下降;确认无误后再写进配置文件并重启。
sql
动态缩小 Buffer Pool(单位字节)
SET GLOBAL innodb_buffer_pool_size = 4294967296; 4 GB
6、其他可能踩坑点
• 大量预处理语句未关闭 → 客户端用完 `DEALLOCATE PREPARE`。
• 大事务未提交 → Undo 段膨胀,内存随之增加。
• 打开太多表 → `table_open_cache`、`table_definition_cache` 设得过高。
• 使用了 MEMORY 引擎临时表,且数据量大 → 改业务或用磁盘临时表。
一句话总结
MySQL 内存 ≈ InnoDB Buffer Pool + 连接数 × 每连接缓冲 + 固定开销。
把 Buffer Pool 调到“够用即可”,把连接数和每连接缓冲压到“业务可接受的最小值”,基本就能解决“占用内存高”的问题。
📣 商家广告 :
👍
0
👎
IP地址: 106.38.130.24
搜索次数: 0
提问时间: 2025-11-10 23:44:16
🛒 域名购买 :
lt.gs kr.gs tc.gs oq2.cn liuwang.com.cn sssp.net v.jl.cn 862.net.cn lw.biz sbnjt.com.cn
❓️ 热门提问 :
vps机 云空间微信聊天记录怎么删除 本地建立ftp服务器 韩国VPS搭建网站软件 服务器 集群 香港股指期货一个点多少钱 站群程序搭建服务公司PEST分析报告 broker域名 网站推广SEO优化 电脑主机出售估价 豌豆Ai站群搜索引擎系统
🌐 域名评估 :
krte.cn catl.love ndgb.cn vv.sd.cn toeh.cn ll.ln.cn z.gz.cn tajp.cn jmum.cn xphone.email
⛏ 最新挖掘 :
凯里酸汤鱼 贵阳烤脑花 都匀毛尖茶 花溪牛肉粉 贵阳烤生蚝 贵阳烤豆腐 贵阳纸包鱼 贵阳特色菜
🖌 热门作画 :
🤝 关于我们:
豌豆Ai
域名
建站
站群
留痕
推广
评估
源码
开发Ai
工具
日记
价格
加盟
广告
流量
留言
联系
🗨 加入群聊 :
🔗 友情链接 :
豌豆Ai站群搜索引擎系统
Top U.S. search engines
ai提问
🧰 站长工具 :Ai工具 whois查询 搜索
📢 温馨提示 :本站所有问答由Ai自动创作,内容仅供参考,若有误差请用“联系”里面信息通知我们人工修改或删除。
👉 技术支持 :本站由豌豆Ai 提供技术支持,使用的最新版:《豌豆Ai站群搜索引擎系统 V.25.10.25》搭建本站。