开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, OceanBase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共2720人左右 1 + 2 + 3 + 4 +5 + 6 + 7 + 8 +9)(1 2 3 4 5 6群均已爆满,7群430+,开8群9群)

一年一年的过,每天都是修炼,当理解了自己才是一切的根源,自己变了,一切都会改变,外在的一切都是相,所有的境遇都是内心的投射,明白这个道理后,不会在向外再去搜寻认可,尊重,不会奢望其他人单纯因为你而变,也不会期望别人对你的认可,求人不如求己,专注打磨自己,对其他人降低期待,因缘而和,因缘而散,保持从容的心,在沉淀中蓄力,需谨记,人心的成见如同一座座大山,我们慢慢的搬,何以畏惧。
最近一段时间,经常有人问MySQL的内存分析,内存到底用到了哪里,为什么内存持续的下降,为什么内存持续的上升。今天我们来通过此文来分析一下MySQL的内存都去哪了。
这里我们先把基准说一说,
1 我们此次的分析对象版本为8.025 MySQL的开源版本 和 PolarDB MySQL 8.02 (相当于MySQL8.018)的版本
2 此次分析我们尽力将可以使用到的方法来进行一个一网打尽。
下面我们先祭出第一个方法,最老的一个方案
show engine innodb status;
| InnoDB | |
=====================================
2025-01-25 21:30:49 140356048033536 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 9 seconds
-----------------
BACKGROUND THREAD
-----------------
srv_master_thread loops: 3 srv_active, 0 srv_shutdown, 8957 srv_idle
srv_master_thread log flush and writes: 0
----------
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count 3
OS WAIT ARRAY INFO: signal count 3
RW-shared spins 0, rounds 0, OS waits 0
RW-excl spins 0, rounds 0, OS waits 0
RW-sx spins 0, rounds 0, OS waits 0
Spin rounds per wait: 0.00 RW-shared, 0.00 RW-excl, 0.00 RW-sx
------------
TRANSACTIONS
------------
Trx id counter 1549
Purge donefor trx's n:o < 1549 undo n:o < 0 state: running but idle
History list length 0
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 421831178706328, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 421831178705472, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 421831178704616, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
--------
FILE I/O
--------
I/O thread 0 state: waiting for completed aio requests (insert buffer thread)
I/O thread 1 state: waiting for completed aio requests (log thread)
I/O thread 2 state: waiting for completed aio requests (read thread)
I/O thread 3 state: waiting for completed aio requests (read thread)
I/O thread 4 state: waiting for completed aio requests (read thread)
I/O thread 5 state: waiting for completed aio requests (read thread)
I/O thread 6 state: waiting for completed aio requests (write thread)
I/O thread 7 state: waiting for completed aio requests (write thread)
I/O thread 8 state: waiting for completed aio requests (write thread)
I/O thread 9 state: waiting for completed aio requests (write thread)
Pending normal aio reads: [0, 0, 0, 0] , aio writes: [0, 0, 0, 0] ,
ibuf aio reads:, log i/o's:, sync i/o's:
Pending flushes (fsync) log: 0; buffer pool: 0
1191 OS file reads, 408 OS file writes, 100 OS fsyncs
0.00 reads/s, 0 avg bytes/read, 0.00 writes/s, 0.00 fsyncs/s
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 0, seg size 2, 0 merges
merged operations:
insert 0, delete mark 0, delete 0
discarded operations:
insert 0, delete mark 0, delete 0
Hash table size 276707, node heap has 0 buffer(s)
Hash table size 276707, node heap has 0 buffer(s)
Hash table size 276707, node heap has 0 buffer(s)
Hash table size 276707, node heap has 1 buffer(s)
Hash table size 276707, node heap has 3 buffer(s)
Hash table size 276707, node heap has 3 buffer(s)
Hash table size 276707, node heap has 2 buffer(s)
Hash table size 276707, node heap has 4 buffer(s)
0.00 hash searches/s, 0.00 non-hash searches/s
---
LOG
---
Log sequence number 18118356
Log buffer assigned up to 18118356
Log buffer completed up to 18118356
Log written up to 18118356
Log flushed up to 18118356
Added dirty pages up to 18118356
Pages flushed up to 18118356
Last checkpoint at 18118356
103 log i/o's done, 0.00 log i/o's/second
----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 1096286208
Dictionary memory allocated 429842
Buffer pool size 65536
Free buffers 64203
Database pages 1320
Old database pages 0
Modified db pages 0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 0, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 1166, created 158, written 239
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
No buffer pool page gets since the last printout
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 1320, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]
----------------------
INDIVIDUAL BUFFER POOL INFO
----------------------
---BUFFER POOL 0
Buffer pool size 8192
Free buffers 7952
Database pages 239
Old database pages 0
Modified db pages 0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 0, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 231, created 8, written 15
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
No buffer pool page gets since the last printout
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 239, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]
---BUFFER POOL 1
Buffer pool size 8192
Free buffers 7989
Database pages 201
Old database pages 0
Modified db pages 0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 0, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 199, created 2, written 4
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
No buffer pool page gets since the last printout
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 201, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]
---BUFFER POOL 2
Buffer pool size 8192
Free buffers 8078
Database pages 112
Old database pages 0
Modified db pages 0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 0, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 108, created 8, written 15
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
No buffer pool page gets since the last printout
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 112, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]
---BUFFER POOL 3
Buffer pool size 8192
Free buffers 8144
Database pages 46
Old database pages 0
Modified db pages 0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 0, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 44, created 2, written 4
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
No buffer pool page gets since the last printout
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 46, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]
---BUFFER POOL 4
Buffer pool size 8192
Free buffers 8117
Database pages 74
Old database pages 0
Modified db pages 0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 0, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 73, created 1, written 10
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
No buffer pool page gets since the last printout
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 74, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]
---BUFFER POOL 5
Buffer pool size 8192
Free buffers 8073
Database pages 117
Old database pages 0
Modified db pages 0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 0, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 50, created 67, written 81
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
No buffer pool page gets since the last printout
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 117, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]
---BUFFER POOL 6
Buffer pool size 8192
Free buffers 7909
Database pages 281
Old database pages 0
Modified db pages 0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 0, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 216, created 65, written 85
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
No buffer pool page gets since the last printout
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 281, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]
---BUFFER POOL 7
Buffer pool size 8192
Free buffers 7941
Database pages 250
Old database pages 0
Modified db pages 0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 0, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 245, created 5, written 25
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
No buffer pool page gets since the last printout
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 250, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]
--------------
ROW OPERATIONS
--------------
0 queries inside InnoDB, 0 queries in queue
0 read views open inside InnoDB
Process ID=4662, Main thread ID=140354489517824 , state=sleeping
Number of rows inserted 0, updated 0, deleted 0, read 0
0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s
Number of system rows inserted 433, updated 324, deleted 168, read 5580
0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s
----------------------------
END OF INNODB MONITOR OUTPUT
============================

内存的信息主要分布在 buffer pool and memory 这部分,首先 Total large memory allocated 1096286208 这个部分是整体的数据库被分配的内存空间 1096286208、1024/1024/1024 = 1.02G 这里总体说明物理内存分配给数据库大约1.02G的内存空间
Dictionary memory allocated 429842 其中数据字典的部分分配了 419KB
Buffer pool size 65536 实际上我们关心的innodb_buffer_pool 到底分配了多大的内存,这里 65536*16KB/1024 = 1G,这里innodb_buffer_pool 被分配了1G的内存空间。Free buffers 64203 其中 64203/65536* 100% = 97% 的innodb_buffer_pool中的页面都是空的未被利用。
那么一般情况下,我们通过这些数据的持续跟踪就可以了解到我们的内存给定的值是否合适。
举例 free buffers 持续都是0 说明我们的给的innodb_buffer_pools的配置需要增加。再如 old database page 0 的这个部分在一定时间经常突然增大,说明LUR 在大量淘汰数据页面,此时如果你没有大量的数据灌入并参与查询的操作等等,那么就有可能在告知你,你的数据库中给定共享的内存部分不足了。
Modified db pages 0
这位置的modified db page 说明到底有多少数据脏页还未刷新的磁盘中。这里我们有一个标定我们 innodb_buffer_pools 的关键的缓冲区命中率。在这里我们也可以进行计算
总页访问次数 (Buffer pool reads + Buffer pool read requests) 包括所有从缓冲池读取的页和从磁盘读取的页。
缓冲池中的读取请求 (Buffer pool read requests) 表示从内存中满足的读取请求。
从磁盘读取的次数 (Buffer pool reads) 表示因为缓冲池中未找到数据而从磁盘读取的次数。
缓冲区命中率 = (Buffer pool read requests / (Buffer pool read requests + Buffer pool reads)) * 100%
这里我们通过node.js的脚本来完成一个简单的内存信息的跟踪过程
const mysql = require('mysql2/promise');
// 配置数据库连接
const dbConfig = {
host: 'localhost',
user: 'root',
password: 'your_password',
database: 'your_database',
};
async functionanalyzeInnoDB() {
try {
const connection = await mysql.createConnection(dbConfig);
console.log('Connected to database.');
// 定时任务,每隔 10 秒执行一次
setInterval(async () => {
try {
// 获取 InnoDB 状态信息
const [rows] = await connection.query('SHOW ENGINE INNODB STATUS');
const innodbStatus = rows[0]?.Status || '';
// 解析缓冲池信息
const bufferPoolSizeMatch = innodbStatus.match(/Buffer pool size\s+(\d+)/);
const dirtyPagesMatch = innodbStatus.match(/Modified db pages\s+(\d+)/);
const pagesReadMatch = innodbStatus.match(/Pages read\s+(\d+)/);
const pagesWrittenMatch = innodbStatus.match(/Pages written\s+(\d+)/);
const readRequestsMatch = innodbStatus.match(/Pages made young\s+(\d+)/);
const diskReadsMatch = innodbStatus.match(/Pages read\s+(\d+)/);
// 数据提取
const bufferPoolSize = bufferPoolSizeMatch ? parseInt(bufferPoolSizeMatch[1]) : 0;
const dirtyPages = dirtyPagesMatch ? parseInt(dirtyPagesMatch[1]) : 0;
const pagesRead = pagesReadMatch ? parseInt(pagesReadMatch[1]) : 0;
const pagesWritten = pagesWrittenMatch ? parseInt(pagesWrittenMatch[1]) : 0;
const readRequests = readRequestsMatch ? parseInt(readRequestsMatch[1]) : 0;
const diskReads = diskReadsMatch ? parseInt(diskReadsMatch[1]) : 0;
// 计算
const dirtyPagesMB = dirtyPages * 16 / 1024; // 每页 16KB 转换为 MB
const hitRate = (readRequests / (readRequests + diskReads)) * 100 || 0; // 命中率 (%)
const readWriteRate = pagesRead + pagesWritten; // 页面流速 (读+写)
// 输出结果
console.log(`--- InnoDB Memory Analysis ---`);
console.log(`Buffer Pool Size: ${(bufferPoolSize * 16 / 1024).toFixed(2)} MB`);
console.log(`Dirty Pages: ${dirtyPagesMB.toFixed(2)} MB`);
console.log(`Hit Rate: ${hitRate.toFixed(2)}%`);
console.log(`Page Flow Rate (Read+Write): ${readWriteRate} pages/s`);
console.log('--------------------------------');
} catch (error) {
console.error('Error analyzing InnoDB:', error);
}
}, 10000); // 每隔 10 秒运行一次
} catch (error) {
console.error('Database connection failed:', error);
}
}
// 启动脚本
analyzeInnoDB();
然后运行这个脚本,我们查看结果,这里脚本是循环的可以持续观察内存的动态。

我们可以持续观察这个MySQL内存分配和脏页以及共享内存部分的命中率的部分。这里hit rate 展示为0 是因为这个数据库服务器是新建的还未进行数据查询等工作,查看hit rate 需要运行一段的数据库的数据才准确。
(脚本目前只是针对本地机带有MySQL的主机部署,需要安装node.js程序)
置顶
2025数据库“新闻”,第四条坐实了开源PG属于谁? 开源MySQL低迷原因在哪?
MySQL相关文章
ORACLE 最终会把 MySQL 弄死对吗?原因是什么! (译)
"DBA 是个der" 吵出MySQL主键问题多种解决方案
MySQL 的SQL引擎很差吗?由一个同学提出问题引出的实验
用MySql不是MySQL, 不用MySQL都是MySQL 横批 哼哼哈哈啊啊
MYSQL --Austindatabases 历年文章合集
PostgreSQL 相关文章
PostgreSQL 运维的难与“难” --上海PG大会主题记录
PostgreSQL 什么都能存,什么都能塞 --- 你能成熟一点吗?
全世界都在“搞” PostgreSQL ,从Oracle 得到一个“馊主意”开始PostgreSQL 加索引系统OOM 怨我了--- 不怨你怨谁
PostgreSQL “我怎么就连个数据库都不会建?” --- 你还真不会!
病毒攻击PostgreSQL暴力破解系统,防范加固系统方案(内附分析日志脚本)
PostgreSQL 远程管理越来越简单,6个自动化脚本开胃菜
PostgreSQL 稳定性平台 PG中文社区大会--杭州来去匆匆
PostgreSQL 分组查询可以不进行全表扫描吗?速度提高上千倍?
POSTGRESQL --Austindatabaes 历年文章整理
PostgreSQL 查询语句开发写不好是必然,不是PG的锅
PostgreSQL 字符集乌龙导致数据查询排序的问题,与 MySQL 稳定 "PG不稳定"
PostgreSQL Patroni 3.0 新功能规划 2023年 纽约PG 大会 (音译)
PostgreSQL 玩PG我们是认真的,vacuum 稳定性平台我们有了
PostgreSQL DBA硬扛 垃圾 “开发”,“架构师”,滥用PG 你们滚出 !(附送定期清理连接脚本)
MongoDB 相关文章
MongoDB 大俗大雅,上来问分片真三俗 -- 4 分什么分
MongoDB 大俗大雅,高端知识讲“庸俗” --3 奇葩数据更新方法
MongoDB 大俗大雅,高端的知识讲“通俗” -- 2 嵌套和引用
MongoDB 大俗大雅,高端的知识讲“低俗” -- 1 什么叫多模
MongoDB 合作考试报销活动 贴附属,MongoDB基础知识速通
MongoDB 使用网上妙招,直接DOWN机---清理表碎片导致的灾祸 (送书活动结束)
数据库 《三体》“二向箔” 思维限制 !8个公众号联合抽奖送书 建立数据库设计新思维
MongoDB 是外星人,水瓶座,怎么和不按套路出牌的他沟通?
17000多张MongoDB表的锅 自动分析删除表数据难题--从头到尾的处理过程(文尾有MongoDB开发规范)
MongoDB 插入更新数据慢,开发问哪的问题?附带解决方案和脚本
MongoDB 挑战传统数据库聚合查询,干不死他们的MongoDB 2023纽约 MongoDB 大会 -- 我们怎么做的新一代引擎 SBE Mongodb 7.0双擎力量(译)
MongoDB 2023年度纽约 MongoDB 年度大会话题 -- MongoDB 数据模式与建模
MongoDB 双机热备那篇文章是 “毒”
MongoDB 会丢数据吗?在次补刀MongoDB 双机热备
MONGODB ---- Austindatabases 历年文章合集
PolarDB 相关文章
POLARDB 添加字段 “卡” 住---这锅Polar不背
PolarDB 版本差异分析--外人不知道的秘密(谁是绵羊,谁是怪兽)
PolarDB 答题拿-- 飞刀总的书、同款卫衣、T恤,来自杭州的Package(活动结束了)
PolarDB for MySQL 三大核心之一POLARFS 今天扒开它--- 嘛是火星人
PolarDB-MySQL 并行技巧与内幕--(怎么薅羊毛)
PolarDB 并行黑科技--从百套MySQL撤下说起 (感谢8018个粉丝的支持)
PolarDB 杀疯了,Everywhere Everytime Everydatabase on Serverless
POLARDB 从一个使用者的角度来说说,POALRDB 怎么打败 MYSQL RDS
PolarDB 最近遇到加字段加不上的问题 与 使用PolarDB 三年感受与恳谈
PolarDB 从节点Down机后,引起的主从节点强一致的争论
PolarDB serverless 真敢搞,你出圈了你知道吗!!!!
PolarDB VS PostgreSQL "云上"性能与成本评测 -- PolarDB 比PostgreSQL 好?
临时工访谈:PolarDB Serverless 发现“大”问题了 之 灭妖记 续集
临时工访谈:庙小妖风大-PolarDB 组团镇妖 之 他们是第一
PolarDB for PostgreSQL 有意思吗?有意思呀
PolarDB Serverless POC测试中有没有坑与发现的疑问
临时工说:从人性的角度来分析为什么公司内MySQL 成为少数派,PolarDB 占领高处
POLARDB -- Ausitndatabases 历年的文章集合
PolarDB for PostgreSQL 有意思吗?有意思呀
临时工访谈系列
国内最大IT服务公司-招聘DBA “招聘广告”的变化--分析与探讨
OceanBase 相关文章
没有谁是垮掉的一代--记 第四届 OceanBase 数据库大赛
跟我学OceanBase4.0 --阅读白皮书 (OB分布式优化哪里了提高了速度)
跟我学OceanBase4.0 --阅读白皮书 (4.0优化的核心点是什么)
跟我学OceanBase4.0 --阅读白皮书 (0.5-4.0的架构与之前架构特点)
跟我学OceanBase4.0 --阅读白皮书 (旧的概念害死人呀,更新知识和理念)
OceanBase 学习记录-- 建立MySQL租户,像用MySQL一样使用OB
临时工访谈:OceanBase上海开大会,我们四个开小会 OB 国产数据库破局者
临时工说:OceanBase 到访,果然数据库的世界很卷,没边
数据库信息速递 阿里巴巴的分布式数据库OceanBase旨在进军中国以外的市场 (翻译)
SQL SERVER 系列
SQL SERVER 如何实现UNDO REDO 和PostgreSQL 有近亲关系吗
SQL SERVER 我没有消失,SQL SERVER下一个版本是2025 (功能领先大多数数据库)
SQL SERVER 2022 针对缓存扫描和Query Store 的进步,可以考虑进行版本升级
阿里云系列
阿里云数据库产品权限设计缺陷 ,六个场景诠释问题,你可以做的更好?
阿里云数据库--市场营销聊胜于无--3年的使用感受与反馈系列
阿里云数据库产品 对内对外一样的卷 --3年阿里云数据库的使用感受与反馈系列
阿里云数据库使用感受--客户服务问题深入剖析与什么是廉价客户 --3年的使用感受与反馈系列
阿里云数据库使用感受--操作界面有点眼花缭乱 --3年的使用感受与反馈系列