命中率怎么算
缓冲池命中率用两个状态量的比值衡量: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 | 扩容前先确认是容量问题还是访问模式问题 |
命中率不是越高越好:批次任务或报表扫了一遍大表,命中率会明显下滑,但这属于一次性访问模式,不代表缓冲池不够。
判断当前状态必须用增量:自启动以来的累计比值在长时间运行后几乎不动,反映不了现在的缓存情况。