key表示实际选用的索引名,仅说明"选了哪个索引"而非"用得对";rows是优化器预估扫描行数,反映索引过滤效率,值接近全表行数常意味索引失效。EXPLAIN 看懂 key 和 rows 的真实含义MySQL 不会直接告诉你"这个索引花了多少毫秒",而是通过 EXPLAIN 暴露执行计划里的关键线索。key 字段显示实际用到的索引名,但很多人误以为只要非 NULL 就代表高效------其实它只说明"选了哪个索引",不等于"用得对"。rows 是优化器预估的扫描行数,不是返回行数,也不是磁盘 IO 次数,但它最能反映索引过滤效率。常见错误现象:rows 接近全表行数,但 key 显示用了索引,说明索引区分度极低(比如在 is_deleted TINYINT 上建索引),或者查询条件没触发最左前缀(WHERE status = ? AND created_at > ? 却只在 (created_at) 上建索引)。用 EXPLAIN FORMAT=JSON 查看 filtered 字段,它表示该条件下行被保留的概率(0--100),低于 10 常意味着索引失效风险高type 为 range 或 ref 通常合理;ALL 或 index 要警惕,尤其当 rows 过大时避免在 WHERE 中对索引字段做函数操作,如 WHERE YEAR(created_at) = 2024 会让 created_at 索引完全失效用 sys.schema_index_statistics 查真实索引使用频次优化器预估可能严重偏离实际。有些索引常年没人用,却拖慢写入性能;有些查询明明走了索引,但因回表开销大,整体反而更慢。MySQL 8.0+ 的 sys 库提供了运行时统计视角。使用场景:上线后想确认某条慢查询是否真靠索引提速了,或清理长期闲置的冗余索引。查某个索引被用了多少次:SELECT * FROM sys.schema_index_statistics WHERE table_name = 'orders' AND index_name = 'idx_user_id_status'注意 reads 是逻辑读次数,不是物理 IO;如果 reads 极低但 select_latency 很高,大概率是回表或排序导致瓶颈该视图不记录历史,重启 MySQL 后归零;若需长期追踪,得配合定期快照或开启 Performance Schema 的 events_statements_history_longoptimizer_trace 揭露为什么没选你期待的索引当你写了索引、EXPLAIN 却显示 key: NULL,别急着改 SQL------先打开优化器追踪,看它到底评估了哪些索引、成本怎么算的。这是定位"索引被忽略"类问题的唯一可靠方式。 There's An AI For That 全球领先的 AI 聚合器,收集10,225个AI工具,可用于超过2,548个任务。
相关推荐
pele3 小时前
PHP源码运行受主板供电影响吗_供电相数重要性说明【技巧】sinat_383437363 小时前
CSS如何实现元素悬浮在页面底部_利用fixed定位与底部间距gmaajt3 小时前
mysql如何备份与恢复函数定义_mysql mysqldump导出存储对象阿丰资源3 小时前
基于SpringBoot的在线视频教育平台的设计与实现(附源码+数据库+文档,一键运行)qq_460978403 小时前
Python爬虫怎么模拟手机端抓取_设置手机型号User-Agent字符串love530love4 小时前
Clink 调校指南:让 Windows CMD 拥有现代终端的便捷体验c++之路4 小时前
C++ 动态内存小熊Coding8 小时前
Python 龙与魔法回合制2D游戏