下面是我总结的一些导致索引失效的原因,可能不太全,希望大家指正,后续遇到其他索引失效的问题将进一步补全。
like运算
索引列以like 做运算,不能以%开头,否则索引失效。如下图:
再看看没有使用到索引的查询时间,从下图可以看出时间为1.8秒
再看看以%结尾的语句能否使用到索引
再看看查询速度 0.085秒
索引列使用函数导致索引失败
使用了函数的查询结果如图
再看看不使用函数是否能用到索引
字符串要加引号
条件为字符串的一定要加引号,字符串如果为数字 mysql 会自动转为字符串,但是不使用索引。下图为没有加引号的sql
下图为加了引号的sql
多列索引
如果是多列索引,那么只有查询条件使用了多列关键字最左边的前缀时,才可以使用索引,否则将不能使用索引。
下图为一个多列索引
因为object_id是最左边的前缀,在上个例子中可以看出单独的object_id可以作为索引。但是单独的tenant_id不能作为索引,违反了最左前缀原则,如下图:
如果使用了多列关键字最左边的前缀(object_id)时,索引生效,如下图:
需要注意的是跳过中间的列会导致索引失效。
详细内容可阅读《高性能的MySql》。
特别的:当or条件中有未建立索引的列会失效,下图edit_type为整型且未建立索引,导致有索引的tenant_id上的索引失效。当or条件中建立了索引的列使用了函数和用了“%”开头,也会导致该表的已有索引失效。
后续补充:连表查询时,关联字段的索引只能在其中一个表中使用到。