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 @ 2022-03-09 22:40  yihailin  阅读(441)  评论(0编辑  收藏  举报