通过EXPLAIN、慢查询日志、performance_schema和状态变量可评估MySQL索引使用情况:1. EXPLAIN的type、key、rows和Extra字段显示单条SQL索引命中详情;2. 慢查询日志中Rows_examined大但返回行少的语句可能未有效使用索引;3. performance_schema.table_io_waits_summary_by_index_usage可查各索引使用频次,COUNT_FETCH为0表示未使用;4. SHOW STATUS LIKE ‘Handler_read%’中Handler_read_key高表明索引使用频繁,Handler_read_rnd过高则可能索引设计不佳。综合这些方法可全面分析索引效率。

在 MySQL 中,索引命中率并不能像缓存命中率那样通过一个直接的系统变量查看。但可以通过查询 执行计划(EXPLAIN) 和分析 慢查询日志、performance_schema 或 information_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,再结合 mysqldumpslow 或 pt-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 表,可查看各索引的使用频率。
PHP5 和 MySQL 圣经
本书是全面讲述PHP与MySQL的经典之作,书中不但全面介绍了两种技术的核心特性,还讲解了如何高效地结合这两种技术构建健壮的数据驱动的应用程序。本书涵盖了两种技术新版本中出现的最新特性,书中大量实际的示例和深入的分析均来自于作者在这方面多年的专业经验,可用于解决开发者在实际中所面临的各种挑战。
466 查看详情
查看索引使用情况:
SELECT OBJECT_SCHEMA AS db, OBJECT_NAME AS table_name, INDEX_NAME, COUNT_FETCH AS index_used_countFROM performance_schema.table_io_waits_summary_by_index_usageWHERE OBJECT_SCHEMA NOT IN ('mysql', 'performance_schema', 'information_schema') AND INDEX_NAME IS NOT NULLORDER 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_rnd 和 Handler_read_next,说明索引命中良好。
基本上就这些方法。通过组合使用 EXPLAIN、慢查询日志、performance_schema 和状态变量,你可以全面掌握 MySQL 中索引的命中与使用情况,进而优化查询和索引设计。
以上就是如何在mysql中分析索引命中率的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1171902.html
微信扫一扫
支付宝扫一扫