如何在mysql中分析索引命中率

来源:这里教程网 时间:2026-02-28 20:16:27 作者:

在 MySQL 中,索引命中率并不能像缓存命中率那样通过一个直接的系统变量查看。但可以通过查询 执行计划(EXPLAIN) 和分析 慢查询日志performance_schemainformation_schema 中的相关数据来间接评估索引的使用情况。以下是几种实用的方法来分析索引是否被有效命中。

1. 使用 EXPLAIN 分析单条 SQL 的索引使用情况

对需要分析的 SELECT 语句使用 EXPLAIN 命令,可以查看 MySQL 是否使用了索引。

示例:
EXPLAIN SELECT * FROM users WHERE user_id = 100;

重点关注以下字段:

type:连接类型,常见值有
const
ref
range
表示使用了索引;
ALL
表示全表扫描,未命中索引。
key:实际使用的索引名称,为 NULL 表示未使用索引。 rows:MySQL 估计需要扫描的行数,越小越好。 Extra:出现
Using index
表示使用了覆盖索引,性能更优。

2. 启用并分析慢查询日志(Slow Query Log)

开启慢查询日志,记录执行时间较长的 SQL,再结合 mysqldumpslowpt-query-digest 工具分析哪些查询未使用索引。

启用慢查询日志:
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
SET GLOBAL log_output = 'TABLE'; -- 或 FILE

之后可查询

mysql.slow_log
表,查找
Rows_examined
值较大但返回行少的语句,这类语句往往未有效使用索引。

3. 查询 performance_schema 获取索引使用统计(MySQL 5.6+)

MySQL 提供了

performance_schema.table_io_waits_summary_by_index_usage
表,可查看各索引的使用频率。

查看索引使用情况:
SELECT 
  OBJECT_SCHEMA AS db,
  OBJECT_NAME AS table_name,
  INDEX_NAME,
  COUNT_FETCH AS index_used_count
FROM performance_schema.table_io_waits_summary_by_index_usage
WHERE OBJECT_SCHEMA NOT IN ('mysql', 'performance_schema', 'information_schema')
  AND INDEX_NAME IS NOT NULL
ORDER BY index_used_count ASC;

如果某个表的索引

COUNT_FETCH
为 0,说明该索引从未被使用,可能是冗余索引。

4. 计算“索引命中率”的参考方法

虽然没有标准的“索引命中率”指标,但可通过以下方式估算:

统计所有查询中使用索引的比例(需结合慢查询和应用层日志)。 监控
Handler_read_%
状态变量,间接判断索引使用效率。
查看相关状态变量:
SHOW STATUS LIKE 'Handler_read%';

关键指标说明:

Handler_read_key:通过索引读取行的次数,值越大表示索引使用频繁。 Handler_read_next:按索引顺序读取下一行,常用于范围查询。 Handler_read_rnd:随机读取(如排序或临时表),过高可能表示索引设计不佳。 Handler_read_first:从索引第一个条目开始读,如
MIN()
查询。

理想情况下,Handler_read_key 应显著高于 Handler_read_rndHandler_read_next,说明索引命中良好。

基本上就这些方法。通过组合使用 EXPLAIN、慢查询日志、performance_schema 和状态变量,你可以全面掌握 MySQL 中索引的命中与使用情况,进而优化查询和索引设计。

相关推荐