讲师中心 微信公众号
AI工具推荐 视频效率加速

为什么MySQL从库内存占用比主库高出许多?

轻辰君_9492

轻辰君_9492

发布时间:2026-06-10 07:20:35

|

1039人浏览过

|

来源于php中文网

原创

从库innodb_buffer_pool_size配置与主库相同但实际使用更高,主因是从库读请求集中、无写入干扰导致缓存更满,而主库因持续写入引发页刷新和LRU调整;此外并行复制积压、分析类查询触发per-connection缓冲区、relay log未消费事件驻留内存等隐性开销共同推高实际占用。

为什么mysql从库内存占用比主库高出许多?

从库的 innodb_buffer_pool_size 配置和主库一样,但实际使用更高

这是最常见也最容易被忽略的错觉。从库的缓冲池大小配置值和主库相同,不代表它“用得少”。相反,从库往往更倾向于把缓冲池填满——因为它的读请求集中在复制回放后的热点查询(比如报表、监控拉取),且没有写入干扰,缓存命中率高、淘汰压力小。而主库有持续写入,会触发页刷新、LRU链调整、脏页刷盘等行为,反而让缓冲池看起来“没那么满”。

验证方式:SELECT ROUND(data_size/1024/1024/1024,2) AS used_gb FROM information_schema.innodb_buffer_pool_stats; 查看真实已用容量;再对比 SHOW VARIABLES LIKE 'innodb_buffer_pool_size'; 看配置上限。如果从库 used_gb 接近上限、主库却只到 60%~70%,说明不是配置问题,而是使用模式差异。

  • 从库默认不接受写,缓冲池不会因写放大产生额外碎片或预分配开销
  • 主库的 innodb_buffer_pool_pages_dirty 持续波动,从库几乎为 0,意味着内存更“干净”、更稳定地驻留数据页
  • 若从库启用了 innodb_buffer_pool_load_at_startup,且上次 dump 的热页多,启动后会主动加载更多页到内存

slave_pending_jobs_size_max 和并行复制导致的隐性内存堆积

MySQL 5.6+ 启用并行复制(slave_parallel_workers > 0)后,从库会预取并暂存待执行的 relay log event。这些事件在应用前就已解包、解析、构造为内存中的事务对象,占用的是 slave_pending_jobs_size_max 控制的独立内存池,不计入 innodb_buffer_pool_size,但会显著抬高 VmRSS。

典型表现:从库 SHOW PROCESSLIST 中出现大量 Waiting for an event from Coordinator 状态线程,同时 SHOW STATUS LIKE 'Slave_received_transactions' 和 Slave_retried_transactions 差值较大,说明事件积压。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • 该参数默认值是 128MB(MySQL 5.7)、1GB(MySQL 8.0),但若网络延迟高或从库 SQL 线程处理慢,积压可能远超设定值
  • 调低 slave_pending_jobs_size_max 可缓解,但可能降低并行复制吞吐;建议结合 slave_preserve_commit_order=ON 和 slave_parallel_type=LOGICAL_CLOCK 一起评估
  • 该内存无法通过 performance_schema.memory_summary_global_by_event_name 直接归类,需靠 /proc/`pidof mysqld`/status 中的 VmRSS 与缓冲池实际用量做差值估算

从库上跑分析类查询,触发大临时表和排序缓冲区

主库通常只承担业务写入和简单读,而从库常被用于 BI 报表、导出、ETL 或 DBA 诊断查询。这类查询动辄扫描百万行、GROUP BY 多字段、ORDER BY 大结果集,会瞬间申请多个 sort_buffer_size、join_buffer_size、tmp_table_size 实例——每个连接独占一份,且不释放直到连接断开。

查证方式:SHOW FULL PROCESSLIST; 找出 State 为 Sorting result、Creating sort index、Copying to tmp table 的长时线程;再用 SELECT user, host, SUM(current_number_of_bytes_used)/1024/1024 AS MB FROM performance_schema.memory_summary_by_account_by_event_name GROUP BY user, host ORDER BY MB DESC LIMIT 5; 看是否某账号内存占比异常高。

  • 临时表超过 tmp_table_size 和 max_heap_table_size(二者必须一致)会落盘,但磁盘临时表仍需先在内存建结构,且 MyISAM/InnoDB 临时引擎本身也有内存开销
  • 从库未设 read_only=ON 时,应用误连从库执行批量 INSERT/UPDATE,也会引发与主库不同的内存行为(如从库无 binlog cache 压力,但有更多 undo log 内存保留)
  • 避免在从库直接跑未加 LIMIT 的 SELECT COUNT(*) 或全表 JOIN,这类操作极易吃光 per-connection 缓冲区

复制延迟期间,relay log 解析与事件缓存持续驻留内存

当从库存在明显复制延迟(Seconds_Behind_Master > 30),IO 线程会持续从主库拉取 relay log 并写入本地文件,SQL 线程则滞后消费。此时,已读取但未执行的 relay log event 会保留在内存中等待解析——尤其是启用 GTID 或 row 格式时,event 解析后生成的 Rows_log_event 对象、Table_map_log_event 映射结构会长期驻留。

这种内存不体现在任何变量或 status 中,但会随延迟时间线性增长。重启 SQL 线程(STOP SLAVE; START SLAVE;)可清空,但治标不治本。

  • 延迟越大,Relay_Log_Space(SHOW SLAVE STATUS 输出)越大,对应内存缓存也越多
  • 检查 SHOW VARIABLES LIKE 'relay_log_info_repository';,若为 FILE(而非 TABLE),则 relay log 位置信息也依赖文件系统缓存,进一步增加 OS 层面的 buff/cache 占用
  • 长期延迟往往伴随磁盘 IO 瓶颈(如从库磁盘慢、sync_binlog=1 主库压力传导),此时应优先优化从库 IO 能力,而非仅调内存参数
真正难排查的,是那些不暴露在 performance_schema 或变量里的内存:复制线程的 event 解析上下文、GTID set 的哈希结构、并行 worker 的事务队列、甚至 jemalloc 分配器本身的内部碎片。它们加起来可能占几 GB,但没有任何一个 SHOW 命令能直接告诉你“这 3.2GB 是谁占的”。所以别只盯着 innodb_buffer_pool_size —— 先确认 VmRSS 是否真高,再一层层剥开。

热门AI工具

更多
蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2253

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

1379

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

815

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3112

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

5248

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

1179

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5511

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

4842

2023.08.14

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

20

2026.10.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 188人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn