在 MySQL 中,索引是否总能提升查询性能?当怀疑索引未生效时,可以通过哪些方法进行排查和验证?
考察说明
考查候选人对 MySQL 索引失效原理的理解,以及通过 EXPLAIN 等手段诊断索引使用情况的能力。
回答思路
- 【回答框架 1】索引并非总能生效,其是否被使用取决于查询条件、索引选择性、优化器成本估算以及表数据分布等因素;优化器会基于统计信息选择自认为代价最低的执行计划。
- 【回答框架 2】常见索引失效场景包括:对索引列使用函数或运算、隐式类型转换、like 以通配符开头、or 连接非索引列、联合索引未遵循最左前缀原则、负向查询(如 not in、!=)等。
- 【回答框架 3】排查索引效果的首要工具是 EXPLAIN,重点查看 type、key、rows、filtered 和 Extra 列;type 从 system 到 all 依次变差,key 显示实际使用的索引,Extra 中的 Using index 表示覆盖索引,Using filesort 或 Using temporary 则提示需要优化。
- 【回答框架 4】还可以通过 SHOW INDEX 查看索引基数,使用 optimizer_trace 观察优化器的成本决策,结合慢查询日志定位低效 SQL。
- 【回答框架 5】优化手段包括:改写 SQL 使其符合索引规则,调整索引列顺序以提升选择性,必要时使用覆盖索引或调整优化器开关,最终以实际执行时间和执行计划验证效果。
- 【关键点 1】索引是否生效由优化器基于成本决定,并非绝对。
- 【关键点 2】EXPLAIN 的 type、key、rows 是判断索引使用情况的核心字段。
- 【关键点 3】函数操作、隐式类型转换、最左前缀失效是常见索引失效原因。
- 【关键点 4】覆盖索引可避免回表,提高查询性能。
- 【易错点 1】不能仅凭存在索引就断定查询会走索引,需结合 EXPLAIN 确认。
- 【易错点 2】索引列上使用函数或计算会导致索引失效。
- 【易错点 3】联合索引必须满足最左前缀原则,否则无法充分利用索引。