MySQL 哪些情况下索引会失效
众所周知,MySQL索引是以B+树存储的,而且是否使用索引是由引擎决定的,当MySQL觉得走索引花费开销大时,反而会放弃走索引。
总结一下,哪些情况下会使索引失效:
- 对where条件中的字段进行了函数操作,比如
month(t_modified)=7
; - 隐式类型转换,比如
where id_card=111
, id_card是varchar, 而输入是111,需要做类型转换。MySQL默认将字符串转换为整数。如果索引字段是整数,条件是字符串,则会将条件转换为整数,不会影响走索引 - 隐式字符编码转换。比如表A 时utf8,表B是 utfmb4,表A join 表B查询,导致连接的字段需要进行字符串编码转换,比如
select * from trade_detail where CONVERT(traideid USING utf8mb4)=$L2.tradeid.value;
如果线上不允许更改表的字符串编码,就只能才有修改SQL的方式了
mysql> select d.* from tradelog l , trade_detail d where d.tradeid=CONVERT(l.tradeid USING utf8) and l.id=2;
4. 模糊搜索,目前只有
LIKE 'aaa%' 这种可以用到索引,其他如
LIKE %a%`用不了索引
总而言之,不要对索引字段做函数操作,可能会破坏索引值的有序性,因此优化器决定放弃走树搜索功能
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署