mysql 左查询剔除空_MySQL索引优化2-优化法则

e899e395f76d61a7c1356621af660e27.png

e4a6c3a3106057b579ae389875a66ad2.png

从上图看到使用name,age,pos建立了一个复合索引,并且排序顺序为name->age->pos。使用此表结构来说一下索引优化和索引失效。

大概总结分为一下几点

  • 全值匹配我最爱(怎么建怎么用)

16aecdf06f9fe4551898d8d86a23536b.png

从三条语句中看出三条语句都用到了索引,而且type类型为ref,where后面的条件越来越多精度越来越高,精度越来越高带来的就是长度和花费的代价也就越来越多(key_len由74-78-140,ref从一个常量变为3个常量)。但是来看下面的情况。

6dc3510865f39912bd98a5cb7803b96e.png

综合上述,我们建的索引是nameAgePos,但是没有了开头的name,如果打破前面创建的索引规则,把where条件剔除掉,使用age和pos或pos来查询的话,紧接着看到的就是全表扫描。没有使用到索引。结合我们下面的说法,就是违背了最佳作前缀法则

  • 最佳作前缀法则

如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且 不跳过索引中的列。综合起来口诀:带头大哥不能死。

我们可以这么联想,我们创建的索引是nameAgePos,name就好比火车的车头,而后面的age和pos就是车厢,火车头自己可以跑,所以说,单独有name的时候索引没有失效。有火车头带着一个车厢也能跑得起来(name,age)。没了车头车厢也不用说只能晾干了。

再来看一个例子

577434543eef1480d9f5509b37e3828e.png

我们把中间的age去掉,显而易见看到理论和实际都使用了索引,ref也是使用常量。但是两个key_len都是62,说明索引并不是全职匹配而是部分匹配。综合口诀:中间兄弟不能断。

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

9243f6ec454551b2c1333d9516744c02.png

相同结果,做出的东西是一样的,但是分析出的性能却差得多。口诀:索引列上少计算

  • 存储引擎不能使用索引中范围条件右面的列

9188d5a143aa6ab07994c5a394141943.png

我们可以看到索引执行的四条中,前三条的type类型都是ref,根据where条件的精度key_len也都在增加,最后一条由于age使用了范围搜索,导致age后的查询条件失效,key_len还是66。综合口诀:范围之后全失效。

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

e583c7257da1aac9987744418dbdcf83.png

首先看第一条和第二条的对比,使用*和使用索引列去查询返回的Extra是多了一个using index(用什么取什么会比写*要好很多)。第三条虽然使用了范围查询导致后面的查询条件失效,但是age确是从索引上拿此时key_len的长度为62,而且type也没有使用range而是ref,效果有所提升。第四条同样是根据name,age,pos查询,条件为等于的type相同,key_len确为66,ref为两个常量,此时的查询也比较优秀。还有一种情况只需要个别字段(第五条),也可以使用using index。

  • MySQL在使用不等于(!= 或<>)的时候无法使用索引会导致全表扫描

c0bf4c2035c277e1746ab79b65b2144c.png

这个时候不能因为会导致索引失效,而不写,但是得知道这种情况下会导致失效,改写的时候还是也要写。最重要还是看生产环境、业务、技术。具体业务具体分析。

  • is null,is not null 也无法使用索引

ed6962f3329616870176c36f5a517be3.png
  • like以通配符开头('%abc...')mysql索引失效回变成全表扫描的操作

f33379704444b6d27dc3a2af3b377a2c.png

从上述结果看出,只有百分号在右面的才能避免索引失效。且type是range。综合口诀:百分like加右面。

那么如何解决百分号在左边导致全表扫描的问题呢?

我们的解决办法是使用覆盖索引 like字符串时索引失效

  • 字符串不加单引号索引失效

4d6f621fc2e7800b3b4352d82651f5b6.png
  • 少用or,用它来连接时回索引失效

0f8de1884ad055ada84e3becb6b46769.png

以上就是索引优化的一些方法,根据上面的例子总结出的一些口诀如下:

  1. 全值匹配我最爱,最左前缀要遵守
  2. 带头大哥不能死,中间兄弟不能断(永远要符合最佳左前缀原则)
  3. 索引列上无计算(计算、函数、(自动、手动)类型转换),范围之后全失效
  4. like百分写最右,覆盖索引不写星
  5. 不等控制还有or,索引失效要少用
  6. var引号不能丢,SQL优化也不难

小例子:

9b2b66356e1fd5d552d6c829241cd4cc.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值