直接回答:常见失效场景:对索引列用函数或运算(DATE(create_time)=...、id+1=10);隐式类型转换(varchar 列传数字);LIKE 以 % 开头;联合索引不满足最左前缀;OR 连接了无索引列;优化器估算全表扫描更便宜(表太小或命中行占比过高)时主动放弃索引。
展开解析:
- 函数运算:B+ 树存原始值,函数结果无法定位;改写成范围条件,或建函数索引(MySQL 8 支持)。
- LIKE '%abc' 前缀不确定无法二分,考虑全文索引或搜索引擎。
- IS NULL 不一定失效,B+ 树含 NULL 项;!=、NOT IN 通常不走索引。
排查:别背规则猜,EXPLAIN 看 key 与 rows,optimizer_trace 能看优化器放弃索引的具体原因。
追问方向:索引下推、函数索引、force index 的使用边界。