MySQL 哪些情况下索引会失效
Posted lyh225
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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%`用不了索引
总而言之,不要对索引字段做函数操作,可能会破坏索引值的有序性,因此优化器决定放弃走树搜索功能
以上是关于MySQL 哪些情况下索引会失效的主要内容,如果未能解决你的问题,请参考以下文章