Mysql在什么情况下索引失效,如何避免索引失效

Mysql在什么情况下索引失效,如何避免索引失效

1、环境准备
mysql的版本
在这里插入图片描述
2、数据库表
在这里插入图片描述

下面来看各种情况:

为字段name,status,address建立复合索引
在这里插入图片描述

1、最左匹配法则:
如果索引了多列,要遵守这个法则。指的是查询从索引的最左前列开始,并且不能跳过中间的列。

1.1、全值匹配,联合索引生效
在这里插入图片描述
1.2、使用name字段,索引也生效,只是索引的长度发生了变化,使用了联合索引中的name字段
在这里插入图片描述
1.3、使用name字段和status字段,索引生效,使用了联合索引中的name和status字段。
在这里插入图片描述
1.4、使用status和address字段,索引失效。不走索引,因为跳过了最左列的name。
在这里插入图片描述
1.5、下面这种情况也是走索引的,有很多人认为这种情况是不走索引,其实是错误的,一开始我们介绍了联合索引的概念,和where条件后顺序是没有关系的,只是看它包不包含这一列,包含了并且无跳过就会走索引。
在这里插入图片描述
1.6、使用name字段和address字段,索引还是生效的,只是走的是name字段的索引,后面address字段不走索引。
在这里插入图片描述
1.7、范围查询右边的列,不能走索引。在status字段使用范围查询,该列后面的字段索引失效。
在这里插入图片描述
1.8、不要在索引列上进行运算操作,索引会失效。
在这里插入图片描述
1.9、隐式转换,字符串类型不加单引号,会造成索引失效。
在这里插入图片描述

1.10、尽量使用覆盖索引,表避免使用select * ,虽然下面这种情况是使用了索引,但是进行了回表查询,在Extra字段中描述了该信息,Using index condition
在这里插入图片描述
如果我们使用查询的全部是索引列,执行计划就会发生改变
在这里插入图片描述
1.11、使用or分割开的条件,如果or前的条件中的列有索引而后面的列没有索引,那么涉及的索引的列都不会被用到。name字段有索引,nicename字段没有索引,name字段的索引也是失效。
在这里插入图片描述
为了解决or索引失效,解决的办法是:使用union。

1.12、以%开头的like模糊匹配索引会失效。
在这里插入图片描述
我们发现,以%在左侧的索引会失效,但是在%在右侧的不会失效。
我们可以使用覆盖索引来解决%在左侧的like索引失效问题
在这里插入图片描述
1.13、is null和 is not null 有时索引失效问题
在这里插入图片描述
is null和 is not null 索引失效和生效问题,根据数据库中的条数来决定。若是null 的条数远多(区分度很明显)is null 是会走索引的,is not null 一样,取决去mysql的底层自行决定是走索引还是全表扫描。
1.14、in 和not in
在这里插入图片描述
证明in走索引,not in 不走索引。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值