MySQL 监控索引使用情况主要依赖 performance_schema.table_io_waits_summary_by_index_usage 表,但该表默认可能未开启采集。适用场景为长期观察索引是否被查询命中,而非单次查询分析。风险边界在于重启后统计清零,且需手动启用相关 instrument 才能看到数据。
先说结论:通过 performance_schema 表可统计索引被读取、写入的真实频次,但必须先启用对应的采集仪器,否则表数据为空。
- 先定位:确认 performance_schema 变量是否为 ON,检查 setup_instruments 中索引相关项是否启用。
- 先做:执行 UPDATE 语句开启 wait/io/table/% 相关仪器,并过滤系统库查询统计表。
- 再验证:观察 COUNT_FETCH 字段是否持续增长,结合 EXPLAIN 确认执行计划是否一致。
命令速用版
以下命令用于快速启用监控并查询索引使用频次,直接复制到 MySQL 客户端执行:
-- 1. 确认 performance_schema 已开启
SHOW VARIABLES LIKE 'performance_schema';
-- 2. 启用索引 I/O 采集仪器
UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'wait/io/table/%';
-- 3. 查询各索引被读取次数(过滤系统库)
SELECT OBJECT_SCHEMA AS db, OBJECT_NAME AS table_name, INDEX_NAME, COUNT_FETCH, COUNT_INSERT, COUNT_UPDATE, COUNT_DELETE
FROM performance_schema.table_io_waits_summary_by_index_usage
WHERE OBJECT_SCHEMA NOT IN ('mysql','information_schema','performance_schema')
ORDER BY COUNT_FETCH DESC;为什么会这样
performance_schema 表默认不显示数据是因为相关采集仪器处于关闭状态,而非 MySQL 未记录。EXPLAIN 展示的是单次查询的理论执行路径,而 performance_schema 记录的是运行时真实调用频次。若未显式启用 instrument,MySQL 为减少开销不会收集索引级别的 I/O 统计,导致查询结果为空。
分步处理
第一步:检查性能监控开关。执行 SHOW VARIABLES LIKE 'performance_schema';,若值为 OFF 需在配置文件中设置 performance_schema=ON 并重启实例。
第二步:开启索引采集仪器。执行 UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'wait/io/table/%';,确保底层 I/O 等待事件被记录。
第三步:查询统计视图。访问 performance_schema.table_io_waits_summary_by_index_usage 表,重点关注 COUNT_FETCH 字段,该值代表索引被用于读取操作的次数。
第四步:排除系统干扰。查询时必须添加 WHERE OBJECT_SCHEMA NOT IN ('mysql','information_schema','performance_schema') 条件,避免内部操作污染统计结果。
怎么验证是否生效
执行几次包含索引的 SELECT 查询后,再次运行统计查询语句,观察 COUNT_FETCH 数值是否增加。若数值持续为 0 且业务确有查询流量,检查慢查询日志确认是否未走索引。对比 EXPLAIN 结果,若 EXPLAIN 显示 key 不为 NULL 但 COUNT_FETCH 为 0,可能是统计延迟或查询被缓存未触发引擎层 I/O。
常见坑
统计重启清零:performance_schema 的统计数据存储在内存中,实例重启后所有计数归零,长期观察需定期快照取差值。
约束索引误删:COUNT_FETCH 为 0 的索引可能是外键或唯一约束所需,删除前需确认是否承载业务约束,避免破坏数据完整性。
时间尺度差异:EXPLAIN 是即时分析,performance_schema 是累计统计,两者不一致时以运行时累计数据为准判断索引冗余。
触发器无效:MySQL 触发器仅响应 DML 事件,无法监控 SELECT 查询的索引使用情况,不要尝试用触发器记录索引命中。
常见问题
performance_schema 表查不到数据怎么办?
默认该表为空是因为采集仪器未开启。需执行 UPDATE performance_schema.setup_instruments 启用 wait/io/table/% 相关项,并确认 performance_schema 变量为 ON。
EXPLAIN 显示用了索引但统计为 0 是什么原因?
可能是查询刚执行完统计有延迟,或 SQL 被缓存未实际触发引擎层 I/O。刷新后再次查询统计表,若仍为 0 则可能未真正发生索引读取。
能否用触发器监控索引使用频率?
不能。触发器仅响应 INSERT、UPDATE、DELETE 事件,对 SELECT 查询无感知,无法记录索引命中次数。
参考来源
- MySQL 8.0 如何监控索引的实时使用情况_查看 Performance Schema 记录
- 如何在 MySQL 8.0 中通过设置索引监控变量来跟踪索引使用热度?
- mysql 如何监控索引命中率_通过性能视图分析未使用的冗余索引
- 如何监控索引使用情况_mysql 索引统计
- MySQL 如何监控索引的使用情况_编写触发器记录特定查询频率
- mysql 如何查看索引的实时利用率_mysql 性能字典监控索引
- mysql 如何查看索引使用情况_mysql 性能监控与 EXPLAIN 分析
- mysql-使用 performance_schema 进行性能监控 - 详解