MySql导致索引失效的原因

  1. WHERE 或 JOIN 中对索引列进行函数/表达式处理

    • 例:WHERE DATE(col)、WHERE UPPER(col)、WHERE col + 1
  2. 在索引列上使用隐式或显式类型转换

    • 例:WHERE col = '123'(字符串与数字类型不匹配)、WHERE col = CONVERT(...)
  3. 对索引列使用前缀模糊匹配之外的模糊匹配(导致无法使用普通 B-Tree 索引)

    • 能用:WHERE col LIKE 'abc%'
    • 不能用:WHERE col LIKE '%abc' 或 WHERE col LIKE '%abc%'
  4. 左前缀索引中查询不使用最左前缀原则

    • 例:对复合索引(idx(a,b,c)),若只查询 b 或 c(没有 a),索引无法被有效利用
  5. OR 条件造成索引无法使用(或效率低)

    • 例:WHERE a = 1 OR b = 2(可通过 UNION 或调整索引优化)
  6. 不等式(<>、!=、IS NULL、IS NOT NULL)或范围查询打断复合索引后续列的使用

    • 例:WHERE a = 1 AND b > 5 AND c = 3,若 b 是范围条件,则 c 的索引可能无法继续使用
  7. 数据分片/分区与查询条件不匹配(导致全表扫描某些分区)

    • 例:分区键未在 WHERE 中使用或使用不当
  8. 索引选择性太差或基数低(例如布尔字段、低基数枚举)

    • 优化:不适合单列索引,考虑复合索引或不建索引
  9. 索引字段包含大量 NULL 值(可能影响优化器选择)

    • 可通过 WHERE IS NOT NULL 或调整数据模型
  10. 索引列顺序不当(复合索引顺序与查询条件顺序不匹配)

    • 复合索引应按查询中最常用和选择性高的列优先排列
  11. 使用 NOT、IS NULL、NOT IN、<> 等否定条件通常不能走索引

    • 例:WHERE col NOT IN (1,2,3)
  12. ORDER BY / GROUP BY 无法使用索引(列顺序或额外列导致文件排序)

    • 例:ORDER BY a,b,与索引(a)不一致或需要额外排序
  13. 隐式或显式使用 DISTINCT/函数导致临时表或文件排序

    • 可能触发全表扫描或额外排序步骤
  14. 索引失效因统计信息不准或优化器选择错误

    • 解决:ANALYZE TABLE、更新统计或强制使用索引(FORCE INDEX)谨慎使用
  15. 小表或查询返回行数很大时,优化器可能选择全表扫描(基于成本估算)

    • 非严格“失效”,但索引未被选用
  16. 使用 LIKE 时字符集或排序规则(collation)问题影响索引匹配

    • 特别是多字节字符或不区分大小写的排序规则
  17. 隐式索引不可用情况:长前缀索引、压缩或函数索引不被支持(版本/存储引擎限制)

posted @ 2026-03-19 08:44  野码  阅读(1)  评论(0)    收藏  举报