Skip to content

索引什么情况下会失效

一、如何判断索引是否失效

通过EXPLAIN执行计划分析SQL语句,若key字段为NULLtype字段为ALL(全表扫描),则说明索引未被使用,存在索引失效情况。


二、常见索引失效场景

1. 违反复合索引的最左前缀法则

  • 定义:复合索引的查询需从索引的最左列开始,且不跳过索引中的列,否则后续列无法命中索引。
  • 示例:复合索引为(name, status, address)
    • 有效:WHERE name = '小米科技'WHERE name = '小米科技' AND status = '1'
    • 失效:WHERE status = '1'(跳过最左列name)、WHERE address = '北京市'(跳过前两列)
    • 部分生效:WHERE name = '小米科技' AND address = '北京市'(跳过中间列status,仅name列索引生效)

2. 范围查询导致右侧索引列失效

  • 定义:复合索引中,范围查询(如><BETWEEN)右侧的列将无法使用索引。
  • 示例:复合索引(name, status, address)
    • WHERE name = '小米科技' AND status > '1' AND address = '北京市'status为范围查询,右侧的address列索引失效,仅namestatus部分生效。

3. 在索引列上进行运算操作

  • 定义:对索引列使用函数、表达式运算(如SUBSTRINGDATE_FORMAT),会导致索引失效。
  • 示例WHERE SUBSTRING(name, 3, 2) = '科技':对name列使用SUBSTRING函数,索引失效,触发全表扫描。

4. 字符串类型字段未加单引号(隐式类型转换)

  • 定义:字符串类型字段查询时未加单引号,MySQL会自动进行类型转换,导致索引失效。
  • 示例WHERE name = '科技' AND status = 0status为字符串类型,未加单引号'0',触发隐式类型转换,索引失效。

5. 以%开头的LIKE模糊查询

  • 定义LIKE模糊查询中,以%开头的模式(如%xxx%xxx%)无法使用索引,仅尾部模糊匹配(如xxx%)可使用索引。
  • 示例
    • 失效:WHERE name LIKE '%黑马程序员'WHERE name LIKE '%黑马程序员%'
    • 有效:WHERE name LIKE '黑马程序员%'

面试相关问题

  1. 问:什么情况下会导致索引失效? 答:常见场景包括违反最左前缀法则、范围查询右侧列失效、索引列上进行运算、字符串未加单引号、以%开头的LIKE查询。

  2. 问:复合索引的最左前缀法则是什么?为什么会失效? 答:复合索引的查询需从最左列开始且不跳过列,否则后续列无法命中索引。因为索引是按列顺序构建的,跳过列会导致MySQL无法匹配索引结构。

  3. 问:LIKE模糊查询什么时候会失效?如何优化? 答:以%开头的模糊查询会失效,仅尾部模糊匹配可使用索引。优化方式包括使用覆盖索引、全文索引,或调整查询逻辑避免前模糊匹配。

  4. 问:为什么在索引列上使用函数会导致索引失效? 答:索引列上的函数运算会改变列的值,MySQL无法直接匹配索引中的有序数据,因此只能触发全表扫描,导致索引失效。

  5. 问:如何判断索引是否失效? 答:通过EXPLAIN执行计划判断,若key字段为NULLtypeALL,则说明索引未被使用,存在失效情况。

Powered by VitePress 1.6.4 | 持续更新中