Skip to content
极高进阶

一句话答案

索引失效常见场景:LIKE 左模糊、对列函数计算、隐式类型转换、违反最左前缀、OR 含非索引列、否定条件。

核心要点

口诀:模头空函否全或

  1. LIKE以%开头
  2. 对索引列使用函数/计算
  3. 隐式类型转换(varchar和int比较)
  4. 联合索引未遵循最左前缀
  5. OR条件中有非索引列
  6. NOT IN / NOT EXISTS / !=
  7. 范围查询后的列
追问与易错

追问方向:

  • 怎么验证索引是否生效?(explain 看 key 和 type)
  • 联合索引 (a,b,c) WHERE a=1 AND c=3 能用索引吗?(只能用 a 部分,ICP 优化可过滤 c)
  • 字符串不加引号为什么索引失效?(隐式类型转换,MySQL 把字段转为数字比较)

易错点:

  • ❌ "有索引就一定走索引"——优化器可能判断全表扫描更快(数据量小/返回行数多)
  • ❌ "OR 一定不走索引"——两边都有索引时可以用 index merge

💡 记忆锚点

索引失效七宗罪,口诀"模头空函否全或":LIKE 左模糊(%abc)、对列用函数或计算、隐式类型转换(varchar 跟 int 比)、跳过最左前缀、NOT IN/!=否定条件、范围后的列、OR 含非索引列。本质都是让 B+ 树无法按顺序定位,只能退化为逐行扫描。