MySQL索引失效

  1. 使用函数或表达式:
    当查询中使用函数或表达式操作列时,MySQL 无法使用该列上的索引。例如,WHERE 子句中使用函数、表达式或算术操作,如 DATE_FORMAT、CONCAT、IF 等,可能导致索引失效。

  2. 列类型不匹配:
    在查询中,如果列的类型与索引的列类型不匹配,索引可能失效。例如,如果索引是整数类型的,但在查询中将该列用作字符串进行比较,那么索引可能无法生效。(隐式转换)

  3. 模糊查询:
    对于模糊查询,例如使用 LIKE 操作符进行模糊匹配,如果模式的开头是通配符 %,则索引可能无法生效。例如,WHERE name LIKE '%John'。

  4. OR 条件:
    当查询中使用 OR 条件时,MySQL 可能无法有效地使用索引,尤其是在多个列上。对于 OR 条件,MySQL 只能选择一个索引来执行查询,导致其他索引失效。

  • or生效场景:
    • 单列上的 OR 条件: 当查询中涉及单个列上的 OR 条件时,并且该列上存在合适的索引,MySQL 可能会使用索引来执行查询。例如,如果查询是 WHERE column1 = value1 OR column1 = value2,而 column1 上有一个合适的索引,MySQL 可能会使用该索引来加速查询。

    • 复合索引上的部分 OR 条件: 如果查询中涉及到复合索引上的部分条件,而复合索引的其他列匹配较好,MySQL 可能会使用索引。例如,如果查询是 WHERE column1 = value1 OR (column1 = value2 AND column2 = value3),而复合索引 (column1, column2) 存在,并且 column1 = value1 条件匹配较多,MySQL 可能会使用该复合索引。

  1. 列的顺序: 对于复合索引(多列索引),列的顺序非常重要。如果查询中的列顺序与复合索引中的列顺序不一致,索引可能会失效。在复合索引中,应将最常用于过滤数据的列放在前面。(不符合最左匹配原则)

  2. 索引上使用了!=、<>判断时,索引失效

  3. 数据量少: 对于某些情况下,数据量非常小的表,MySQL 可能选择不使用索引,直接全表扫描来执行查询,以避免索引的额外开销。

  4. 数据分布不均匀: 当数据分布不均匀时,MySQL 可能选择不使用索引,因为全表扫描可能更快。例如,某些值的重复度过高,而其他值很少出现。

  5. 统计信息不准确: MySQL 使用统计信息来优化查询计划,如果统计信息不准确或过期,MySQL 可能做出不合理的查询计划,导致索引失效。

ps:
IS NULL 和 IS NOT NULL 条件通常不会导致索引失效,而是可以有效地使用索引来优化查询。

posted @   一个苦逼的23届毕业生  阅读(113)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示