外观
一句话答案
索引失效常见场景:LIKE 左模糊、对列函数计算、隐式类型转换、违反最左前缀、OR 含非索引列、否定条件。
核心要点
口诀:模头空函否全或
- LIKE以%开头
- 对索引列使用函数/计算
- 隐式类型转换(varchar和int比较)
- 联合索引未遵循最左前缀
- OR条件中有非索引列
- NOT IN / NOT EXISTS / !=
- 范围查询后的列
追问与易错
追问方向:
- 怎么验证索引是否生效?(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+ 树无法按顺序定位,只能退化为逐行扫描。