如何确认上一次查询是否使用了InnoDB buffer pool?
如何确凿验证查询是否使用了InnoDB缓冲池
绝对不用靠猜!作为常年跟MySQL性能调优打交道的老司机,我整理了几个实打实的方法,能给你确凿的证据,判断查询结果是来自InnoDB缓冲池还是磁盘读取:
方法1:通过InnoDB核心状态变量做快速验证
这个方法简单直接,是我平时快速验证的首选:
- 先记录初始状态值:
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read%';
你会得到两个关键指标:
Innodb_buffer_pool_read_requests:从缓冲池读取数据的总请求数Innodb_buffer_pool_reads:直接从磁盘读取数据的总请求数
执行你要验证的目标查询。
再次执行上面的状态查询,对比两个指标的变化:
- 如果
Innodb_buffer_pool_reads没有增加,说明这次查询完全用了缓冲池的数据 - 如果
Innodb_buffer_pool_reads增加了,说明有部分/全部数据是从磁盘读的
小技巧:要是测试单条查询的影响,最好在测试前先执行
FLUSH STATUS重置状态变量,这样差值会更清晰。不过注意,FLUSH STATUS会重置所有状态变量,别在生产环境随便用!
方法2:用Performance Schema做精准追踪(适合深入分析)
如果想要更细粒度的验证,比如知道具体是哪个表/索引的读取来自磁盘,Performance Schema是绝佳工具:
- 先确保Performance Schema已开启(MySQL 5.7+默认开启):
SHOW VARIABLES LIKE 'performance_schema';
如果是OFF,可以临时开启:SET GLOBAL performance_schema = ON;
- 开启InnoDB文件IO的监控:
UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'wait/io/file/innodb/%'; UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE '%file%';
- 执行查询前,先记录当前的磁盘IO统计:
SELECT FILE_NAME, COUNT_READ, SUM_TIMER_READ FROM performance_schema.file_summary_by_instance WHERE FILE_NAME LIKE '%ibd';
- 执行目标查询,然后再次查询上面的统计:
- 如果
COUNT_READ和SUM_TIMER_READ没有变化,说明查询完全用了缓冲池 - 如果数值增加,说明有磁盘读取操作
方法3:利用SHOW ENGINE INNODB STATUS的缓冲池统计
这个方法能帮你查看缓冲池的整体命中率,辅助验证全局趋势:
执行:
SHOW ENGINE INNODB STATUS\G
在输出的BUFFER POOL AND MEMORY部分,找到Buffer pool hit rate,比如1000 / 1000就是100%命中率,说明几乎所有读取都来自缓冲池。不过这个是全局统计,适合看整体情况,验证单条查询还是前两个方法更精准。
额外小技巧:预热缓冲池后对比测试
如果你的查询是重复执行的,可以先预热缓冲池(比如先执行一次查询把数据加载到缓冲池),然后第二次执行时看执行时间:
- 如果第二次执行时间大幅缩短,结合状态变量的变化,就能确凿证明第一次是磁盘读取,第二次用了缓冲池
内容的提问来源于stack exchange,提问作者Mohd Abdul Mujib
相关产品推荐
相关产品推荐

