MySQL索引失效或部分失效的情况

MySQL版本:8.0.21

1.最佳左前缀法则

  使用复合索引时,索引的使用顺序应该严格执行建立索引时的顺序,把复合索引看成一列火车,若复合索引中间有一个索引字段没有用上就相当于火车中间有一节车厢脱节,那么这节脱节车厢,包括后面的所有车厢都会脱节,即后面的所有字段都不会用上索引。最严重的是如果第一个字段索引顺序就不对,则索引完全失效。所以出现这种问题最好重新建立索引改复合索引中的字段顺序

全匹配情况:
整列火车完整,跑起来很好
type = ref,key_len = 170
在这里插入图片描述
最左前缀匹配:
车头还在,车身没了,跑起来也还行
type = ref,key_len = 82
在这里插入图片描述
最左前缀匹配,第一节车厢还在:
车头还在,第一节车厢也还在
所以type = ref,key_len = 87
在这里插入图片描述

最左前缀匹配,后面少了age复合索引字段:
车头还在,第一节车厢丢了,后面的车厢全丢了
所以type = ref,key_len = 82
在这里插入图片描述
最左前缀不匹配
车头没了,索引根本跑不起来
所以type是all,没有用到索引
在这里插入图片描述

2.在索引列上搞小动作

  在索引列上发生的计算(包括!=),函数,类型转换(包括自动)操作都会导致索引失效
火车头有操作,整列火车就跑不起来
type = all
在这里插入图片描述
第一节车厢有操作,火车头独活,包括第一节车厢在内的后面的所有车厢都报废了
type = ref,key_len = 82
在这里插入图片描述
第二节车厢有操作,火车头带着第一节车厢跑路了,后面的所有车厢报废
type = ref,key_len = 87
在这里插入图片描述

3.索引出现范围条件

  在范围条件的索引字段之后的复合索引字段失效,之前的无影响
第一节车厢使用范围,火车头和第一节车厢还活着,第二节包括之后的车厢go die
在这里插入图片描述

4.覆盖索引

  尽量用到覆盖索引,非必要不用select*
使用覆盖索引,Extra里会有Using index
在这里插入图片描述
使用 * 则Extra为空
在这里插入图片描述

5. NULL相关

  IS NULL IS NOT NULL会使索引失效,效果同索引出现范围条件。
第一节车厢使用null,火车头和第一节车厢还活着,第二节包括之后的车厢go die
在这里插入图片描述
车头使用null,一家人整整齐齐go die
在这里插入图片描述

6.like通配符相关

  1. 使用%xxx或%xxx%这两种方式会使索引失效,如果可以,则选择使用xxx%这种在右边加通配符的情况。
    索引失效的情况相当于在索引上搞小动作
    火车头通配符选择用%开头报废整列火车
    在这里插入图片描述
    火车头通配符不选择用%开头,type = range,符合e开头的都可以使用name_age_jobs索引,索引key_len = 170用到了Using index只是没用到ref的常量,效果还算不错。
    在这里插入图片描述
    第二节车厢通配符选择用%开头报废第二节及以后的所有车厢,好在火车头和第一节车厢不受影响,所以type = ref ,ref也使用到了两个常量,相比火车头崩了还是很不错的
    在这里插入图片描述
    第二节车厢通配符不选择用%开头,复合索引全部用上了,type = range,key_len = 170
    在这里插入图片描述
  2. 当必须使用%开头时,则应该建立覆盖索引,并且应该尽量避免查询除了覆盖索引涉及到的字段之外的其他字段的情况。
    使用覆盖索引,type = index
    在这里插入图片描述
    查询没有使用到覆盖索引,type = all
    在这里插入图片描述

7.字符串不加单引号

字段为varchar类型但是sql中没有加引号,可能不会影响查询结果,但是一定会影响查询效率。
正常情况
在这里插入图片描述
索引失效情况
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/TreeCode/article/details/108507635