MySql索引优化中索引失效和如何避免索引失效

一:索引

MySql官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构,可以得到索引的本质:索引是数据结构。

你可以简单理解为"排好序的快速查找的数据结构",因此,当我们建立了索引之后,我们应该如何避免索引失效呢?

二:如何避免索引失效

1:最佳左前缀法则:如果索引了多列,要遵守最左前缀法则,指的是查询从索引的最左前列开始并且不跳过索引的列

表的结构大致是这个样子

这是建立的索引(索引字段顺序,name,age,pos):

A:当想要通过年龄和位置去查询时:

发现type是ALL,查询效果最差的,并且没有用到索引

B:当想要通过位置去查询时:

发现type是ALL,查询效果最差的,并且没有用到索引,和上述的结果一样

C:当想要通过姓名去查询时

发现了type是ref,并且用到了索引,key_len是74,这是为什么呢?

正如我们上面所介绍的,索引建立以后,应该从最左开始,建立的字段不能丢失。比如火车不能没有火车头

D:再举一个例子

我们查询了索引字段中的第一个和第三个,发现key_len是74,按理来说查询的精度越高应该key_len就越长,并没有将索引全部用到。因此不能跳过索引中的列。

2:不在索引列上做任何操作(计算,函数,(自动or手动)类型转换),会导致索引失效而转向全表扫描

从上面可以看出下面用到了函数查询,从左开始取四位,两次的查询结果一致,但是用了Explain之后发现一个type是ref,一个是ALL,上面的用到了索引,下面用到了Mysql函数后取截取name,导致索引失效。也印证了上面的话。

3:存储引擎不能使用索引中范围条件右边的列

如果索引都用到了的话,key_len应该是140,而此时是78,表示只用到了两个字段,范围查找导致后面的索引失效

4:like以通配符开头('%abc/...')mysql索引失效会变成全表扫描的操作

5:尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select*

6:mysql在使用不等式(!=或者<>)的时候无法使用索引而导致全表扫描

可以看出用到了不等式,从表中可以看出key是null,并没有用到索引

7:is,null,is not null也无法使用索引

理论上用到索引,实际上并没有用到

8:like以通配符开头('%abc...')mysql索引失效会变成全表扫描的操作

但在右边写%的话

如果想要使用%%的话如何建立索引呢?

我们建立覆盖索引在name,age字段上,id是主键

当我们查询的字段在我们的索引的字段里的话,就会用到索引

当查找全部的时候,查找的字段超过了索引的范围就会让索引失效,所以如何建立索引要从实际情况考虑。

9:字符串不加单引号索引失效

10:少用or,用它连接时会索引失效

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值