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个任务。
相关推荐
昵称画6 小时前
交接班记录电子化:三班之间的信息不漏“AI国潮设计-小江”6 小时前
【AIGC实战】Python+SDXL批量生成“潮汕英歌舞不倒翁”IP | 角色一致性与多场景融合方案,附完整代码Linux_cy6 小时前
服务器管理工具哪个好用?我用了七八个MoRanzhi12036 小时前
第6篇(下)· 使用 PyQt5 实现 2048 高性能计算版:统一运行控制与跨模式安全交接code tsunami6 小时前
【无标题】缓慢更新6 小时前
审批的加签与会签:多人意见怎么合CodeGL7 小时前
10、Python基础之进程和线程跨境联盟7 小时前
大健康实体如何搭建产品差异化:对比普通营养品与合规跨境膳食补充剂服务模式有想法的py工程师7 小时前
PostgreSQL EXPLAIN中的Cost模型分析(random_page_cost参数):优化器眼中的代价世界与执行计划生成前进的李工8 小时前
飞书企业知识库设计+后端高频八股