主题切换
索引什么情况下会失效
一、如何判断索引是否失效
通过EXPLAIN执行计划分析SQL语句,若key字段为NULL或type字段为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列索引失效,仅name和status部分生效。
3. 在索引列上进行运算操作
- 定义:对索引列使用函数、表达式运算(如
SUBSTRING、DATE_FORMAT),会导致索引失效。 - 示例:
WHERE SUBSTRING(name, 3, 2) = '科技':对name列使用SUBSTRING函数,索引失效,触发全表扫描。
4. 字符串类型字段未加单引号(隐式类型转换)
- 定义:字符串类型字段查询时未加单引号,MySQL会自动进行类型转换,导致索引失效。
- 示例:
WHERE name = '科技' AND status = 0:status为字符串类型,未加单引号'0',触发隐式类型转换,索引失效。
5. 以%开头的LIKE模糊查询
- 定义:
LIKE模糊查询中,以%开头的模式(如%xxx、%xxx%)无法使用索引,仅尾部模糊匹配(如xxx%)可使用索引。 - 示例:
- 失效:
WHERE name LIKE '%黑马程序员'、WHERE name LIKE '%黑马程序员%' - 有效:
WHERE name LIKE '黑马程序员%'
- 失效:
面试相关问题
问:什么情况下会导致索引失效? 答:常见场景包括违反最左前缀法则、范围查询右侧列失效、索引列上进行运算、字符串未加单引号、以
%开头的LIKE查询。问:复合索引的最左前缀法则是什么?为什么会失效? 答:复合索引的查询需从最左列开始且不跳过列,否则后续列无法命中索引。因为索引是按列顺序构建的,跳过列会导致MySQL无法匹配索引结构。
问:
LIKE模糊查询什么时候会失效?如何优化? 答:以%开头的模糊查询会失效,仅尾部模糊匹配可使用索引。优化方式包括使用覆盖索引、全文索引,或调整查询逻辑避免前模糊匹配。问:为什么在索引列上使用函数会导致索引失效? 答:索引列上的函数运算会改变列的值,MySQL无法直接匹配索引中的有序数据,因此只能触发全表扫描,导致索引失效。
问:如何判断索引是否失效? 答:通过
EXPLAIN执行计划判断,若key字段为NULL或type为ALL,则说明索引未被使用,存在失效情况。