Yihui’s Blog

MySQL 中使用索引一定有效吗?如何排查索引效果?

日期:2026-07-05 难度:中等 标签:#面试 #八股 #MySQL #索引 #性能排查 #VIP #场景题

一句话答案

使用索引不一定有效,索引是否生效取决于查询条件、选择性、统计信息、回表成本、排序分组和优化器选择;排查时应结合慢 SQL、EXPLAIN、执行耗时、扫描行数和实际业务数据分布分析。

面试口语版

索引不是建了就一定会用,也不是用了就一定快。比如条件区分度很低、函数包裹索引列、隐式类型转换、前导模糊匹配、范围太大、大量回表、统计信息不准,都可能导致索引效果差甚至不走索引。排查时我会先定位慢 SQL,再用 EXPLAIN 看 type、key、rows、Extra,确认是否用了预期索引、扫描行数是否合理、是否 filesort、temporary、回表过多;必要时用 EXPLAIN ANALYZE 看实际执行情况。

原理拆解

flowchart TD
  A[发现慢 SQL] --> B[查看 SQL 和参数]
  B --> C[EXPLAIN 执行计划]
  C --> D{是否使用预期索引}
  D -- 否 --> E[检查函数/隐式转换/最左前缀/统计信息]
  D -- 是 --> F[检查 rows 和回表成本]
  F --> G[检查 filesort/temporary]
  G --> H[调整 SQL 或索引]
  H --> I[压测和线上观察]

关键细节

  • type 从好到差大致有 const、ref、range、index、ALL。
  • key 表示实际选择的索引,不一定是你期望的索引。
  • rows 是估算扫描行数,不是精确值。
  • Extra 中关注 Using filesort、Using temporary、Using index、Using index condition。
  • 索引列上使用函数、表达式或隐式转换可能导致索引失效。
  • 优化器可能因回表成本高而选择全表扫描。
  • 统计信息过旧时可以考虑 ANALYZE TABLE。

面试官追问

  1. 哪些情况会导致索引失效?
  2. EXPLAIN 重点看哪些字段?
  3. 为什么明明有索引却走全表扫描?
  4. Using index 和 Using filesort 分别说明什么?
  5. 如何优化一个慢查询?

常见错误说法

错误说法问题更好的说法
建索引就一定快错误取决于选择性、回表、扫描范围和执行计划
没走索引就是 MySQL 有问题片面可能是 SQL 写法、统计信息或成本估算导致
EXPLAIN rows 是真实扫描行数错误通常是优化器估算值

学习清单

  • 熟悉 EXPLAIN 常用字段。
  • 总结 8 类索引失效场景。
  • 用慢 SQL 案例练习从 SQL 到索引的排查过程。
维护与整理 · Yihui在 GitHub 上编辑

继续阅读

浏览全部文章

SQL与NoSQL有什么区别?MySQL和MongoDB如何选型?实际项目中如何选择?

日期:2026-09-27 标签:#面试 #MySQL #数据库 难度:简单 来源:牛面 MySQL 题库 答案说明:独立整理(站内题目标记为 VIP,未读取会员答案) 一句话答案 MySQL与MongoDB的主要差异在数据模型、事务边界、查询方式和模式演化;按业务访问模式和一致性需求选型。 面试口语版(约 60…

阅读全文