1. 导致索引失效的完整场景清单,隐式类型转换、函数包裹列、前导通配符 LIKE、OR 连接非索引列、隐式排序规则不一致——各自的原理与改写方案?
导致索引失效的完整场景有哪些?隐式类型转换、函数包裹列、前导通配符 LIKE、OR 连接非索引列、排序规则不一致各自的原理与改写方案?
- 隐式类型转换与函数包裹列:列被计算后 B-Tree 无法定位
- 前导通配符 LIKE:无法确定范围起点;OR 非索引分支拖垮整体
- 排序规则不一致:隐式转换使索引失效;各自改写方案
索引失效的完整清单与原理:① 隐式类型转换——WHERE int_col = '123' 时列被 CAST 包裹(等价函数包裹列),B-Tree 索引无法命中;改写为类型一致的比较(id = CAST('123' AS UNSIGNED) 或统一列类型)。② 函数包裹列——WHERE YEAR(created_at)=2024 使列成为函数参数,索引失效;改写为范围条件(created_at BETWEEN '2024-01-01' AND '2024-12-31')或建函数索引/表达式索引。③ 前导通配符 LIKE——LIKE '%abc' 无法确定范围起点(B-Tree 按前缀有序),只能全扫;'abc%' 则可走索引。④ OR 连接非索引列——WHERE idx_col=1 OR other_col=2 中非索引分支无法用索引,需索引合并或全表;改写为 UNION ALL 或 IN。⑤ 排序规则不一致——JOIN 两侧列 collation 不同(如 utf8mb4_0900_ai_ci vs utf8mb4_general_ci)时需对一侧做转换,索引失效;统一 collation 或显式 COLLATE 一致。
排查建议:EXPLAIN 看 key=NULL、type=ALL 或 index(全索引扫)结合 key_len 判断;每类场景都有对应的"改写优先、建索引兜底"方案。
本题考察索引失效的全景分类:五类场景的原理统一为"键序无法定位"或"分支无法命中",每类给出改写方案,形成清单式回答。