MySql导致索引失效的原因
-
WHERE 或 JOIN 中对索引列进行函数/表达式处理
- 例:WHERE DATE(col)、WHERE UPPER(col)、WHERE col + 1
-
在索引列上使用隐式或显式类型转换
- 例:WHERE col = '123'(字符串与数字类型不匹配)、WHERE col = CONVERT(...)
-
对索引列使用前缀模糊匹配之外的模糊匹配(导致无法使用普通 B-Tree 索引)
- 能用:WHERE col LIKE 'abc%'
- 不能用:WHERE col LIKE '%abc' 或 WHERE col LIKE '%abc%'
-
左前缀索引中查询不使用最左前缀原则
- 例:对复合索引(idx(a,b,c)),若只查询 b 或 c(没有 a),索引无法被有效利用
-
OR 条件造成索引无法使用(或效率低)
- 例:WHERE a = 1 OR b = 2(可通过 UNION 或调整索引优化)
-
不等式(<>、!=、IS NULL、IS NOT NULL)或范围查询打断复合索引后续列的使用
- 例:WHERE a = 1 AND b > 5 AND c = 3,若 b 是范围条件,则 c 的索引可能无法继续使用
-
数据分片/分区与查询条件不匹配(导致全表扫描某些分区)
- 例:分区键未在 WHERE 中使用或使用不当
-
索引选择性太差或基数低(例如布尔字段、低基数枚举)
- 优化:不适合单列索引,考虑复合索引或不建索引
-
索引字段包含大量 NULL 值(可能影响优化器选择)
- 可通过 WHERE IS NOT NULL 或调整数据模型
-
索引列顺序不当(复合索引顺序与查询条件顺序不匹配)
- 复合索引应按查询中最常用和选择性高的列优先排列
-
使用 NOT、IS NULL、NOT IN、<> 等否定条件通常不能走索引
- 例:WHERE col NOT IN (1,2,3)
-
ORDER BY / GROUP BY 无法使用索引(列顺序或额外列导致文件排序)
- 例:ORDER BY a,b,与索引(a)不一致或需要额外排序
-
隐式或显式使用 DISTINCT/函数导致临时表或文件排序
- 可能触发全表扫描或额外排序步骤
-
索引失效因统计信息不准或优化器选择错误
- 解决:ANALYZE TABLE、更新统计或强制使用索引(FORCE INDEX)谨慎使用
-
小表或查询返回行数很大时,优化器可能选择全表扫描(基于成本估算)
- 非严格“失效”,但索引未被选用
-
使用 LIKE 时字符集或排序规则(collation)问题影响索引匹配
- 特别是多字节字符或不区分大小写的排序规则
-
隐式索引不可用情况:长前缀索引、压缩或函数索引不被支持(版本/存储引擎限制)

浙公网安备 33010602011771号