首页/数据/SQL 速查/缓冲池命中率与物理读
性能与执行计划72 条

缓冲池命中率与物理读

Innodb_buffer_pool_reads 是磁盘读取页数、read_requests 是请求总数:两者比值反映读命中情况。

SQL 速查数据更新于 2026-10-13

命中率怎么算

缓冲池命中率用两个状态量的比值衡量:Innodb_buffer_pool_read_requests 是逻辑读请求总数(包含命中),Innodb_buffer_pool_reads 是其中未命中、需要从磁盘读的页数。命中率就是 1 减去两者之比,它反映热数据有多少留在内存里。

基本信息

read_requests逻辑读请求总数,包含命中
reads未命中、需要物理读的次数
判读方法用短窗口取两次快照做差,累计比值几乎不变
注意命中率低不等于要扩容缓冲池,先看是否扫了未缓存的大表
适用平台MySQL InnoDB

典型使用场景

  • 判断热数据是否常驻内存
  • 为缓冲池扩容找依据
  • 排查一次性大扫描对缓存的影响
  • 对比业务变化前后的缓存压力
  • 配合物理读指标解释查询变慢

取数与计算

取数与计算
-- 先看两个基础状态量
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read%';

-- 累计口径的命中率:跨度越长越平滑,不适合判断当前状态
SELECT
  ROUND((1 - (SELECT VARIABLE_VALUE FROM performance_schema.global_status
              WHERE VARIABLE_NAME = 'Innodb_buffer_pool_reads')
           / (SELECT VARIABLE_VALUE FROM performance_schema.global_status
              WHERE VARIABLE_NAME = 'Innodb_buffer_pool_read_requests')
  ) * 100, 2) AS hit_pct;

-- 判读要点:连续两次采样取差值再算,才是当前窗口的命中率

指标怎么读

指标含义怎么用
read_requests逻辑读请求总数(含命中)作为分母
reads未命中需要物理读的页数作为分子,越小说明数据在内存
命中率1 减去 reads 与 requests 之比只有短窗口增量才有判断价值
物理读是否真的落盘还要看系统层指标单独看命中率容易误判
缓冲池大小innodb_buffer_pool_size扩容前先确认是容量问题还是访问模式问题
命中率不是越高越好:批次任务或报表扫了一遍大表,命中率会明显下滑,但这属于一次性访问模式,不代表缓冲池不够。
判断当前状态必须用增量:自启动以来的累计比值在长时间运行后几乎不动,反映不了现在的缓存情况。

易错点

  • 把命中率当唯一指标:低命中但查询很快的场景(全扫小表)并不需要扩容缓冲池
  • 用自启动累计值判断当前状态:运行时间越长累计比率越迟钝,必须取增量
  • 命中率下滑就立刻扩容:先确认是不是一次性大扫描或访问模式改变导致
  • 忽略单条大查询的影响:扫全表的语句会污染缓存,把热数据挤出去
  • 只算比值不看绝对量:请求量很低时命中率再高也说明不了负载

数据来源与参考

  • MySQL 8.0 Reference Manual §5.1.10 Server Status Variables
  • MySQL 8.0 Reference Manual · InnoDB Buffer Pool
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌