MySQL索引失效
-
使用函数或表达式:
当查询中使用函数或表达式操作列时,MySQL 无法使用该列上的索引。例如,WHERE 子句中使用函数、表达式或算术操作,如 DATE_FORMAT、CONCAT、IF 等,可能导致索引失效。 -
列类型不匹配:
在查询中,如果列的类型与索引的列类型不匹配,索引可能失效。例如,如果索引是整数类型的,但在查询中将该列用作字符串进行比较,那么索引可能无法生效。(隐式转换) -
模糊查询:
对于模糊查询,例如使用 LIKE 操作符进行模糊匹配,如果模式的开头是通配符 %,则索引可能无法生效。例如,WHERE name LIKE '%John'。 -
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 可能会使用该复合索引。
-
-
列的顺序: 对于复合索引(多列索引),列的顺序非常重要。如果查询中的列顺序与复合索引中的列顺序不一致,索引可能会失效。在复合索引中,应将最常用于过滤数据的列放在前面。(不符合最左匹配原则)
-
索引上使用了!=、<>判断时,索引失效
-
数据量少: 对于某些情况下,数据量非常小的表,MySQL 可能选择不使用索引,直接全表扫描来执行查询,以避免索引的额外开销。
-
数据分布不均匀: 当数据分布不均匀时,MySQL 可能选择不使用索引,因为全表扫描可能更快。例如,某些值的重复度过高,而其他值很少出现。
-
统计信息不准确: MySQL 使用统计信息来优化查询计划,如果统计信息不准确或过期,MySQL 可能做出不合理的查询计划,导致索引失效。
ps:
IS NULL 和 IS NOT NULL 条件通常不会导致索引失效,而是可以有效地使用索引来优化查询。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!