MySQL 哪些情况下索引会失效

众所周知,MySQL索引是以B+树存储的,而且是否使用索引是由引擎决定的,当MySQL觉得走索引花费开销大时,反而会放弃走索引。

总结一下,哪些情况下会使索引失效:

  1. 对where条件中的字段进行了函数操作,比如month(t_modified)=7;
  2. 隐式类型转换,比如where id_card=111, id_card是varchar, 而输入是111,需要做类型转换。MySQL默认将字符串转换为整数。如果索引字段是整数,条件是字符串,则会将条件转换为整数,不会影响走索引
  3. 隐式字符编码转换。比如表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%`用不了索引

总而言之,不要对索引字段做函数操作,可能会破坏索引值的有序性,因此优化器决定放弃走树搜索功能

posted @   yihailin  阅读(461)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
点击右上角即可分享
微信分享提示