mysql索引左侧原则,你真的了解吗?

JAVA葵花宝典

共 1166字,需浏览 3分钟

 · 2020-08-22

前言

写这篇文章源自一位杠精同事提了个问题,左侧原则跟where条件顺序有无关系?我想了想,好像是有关系的!不敢确定,但是自己又懒得动手测试,于是发起ETC自动抬杠功能,强行杠了一拨,结果杠输了,接下来即是动手验证..

预习执行计划

实践

咱们先申明前置条件,创建表如下:

创建复合索引如下注意哦,索引使用的BTree:

我们先来一个提问,看如下两条sql,我们花5秒时间思考下,会走索引吗?

  • sql-1 根据code查询:

  • sql-2 根据name查询:

  • 5

  •   4
  •           3
  •                   2
  •                            1

时间到,咱们看下实际结果.

  • sql-1 执行计划:

  • sql-2 执行计划:

怎麽~样,是否跟你们想象的一样呢?我们继续验证查询条件的顺序是否影响sql的执行计划.   为了方便截图,以下我主要使用SecureCRT查询.

我们列举以上五条sql来验证,查询结果如下:

从上图很明显可以看出,where条件的顺序完全不影响索引的执行,但是很明显上面5条sql所有查询条件都是包含在复合索引内,那要是有查询条件不在符合索引内又是什么结果呢,我们列举4条sql继续求证...

这里发现不一样了,我们的复合索引顺序是name,code,createTime.

当出现非索引字段的查询条件时,只有包含了name的查询条件走了索引.这是为什么呢?

原来是因为我们用了B+树索引数据结构,它是按照从左到右的顺序建立索引,同时mysql查询优化器会优化sql语句,不管where条件顺序如何变化,都会按照索引左侧原则去优化(注意咯是按照索引的左侧,不是where条件的左侧条件哦),以效率最高的方式去执行sql.

好了,到了这里,问题已经解决.不知道童鞋们有没有疑问,上面我们一直说的是BTree索引数据结构,假如是hash结构呢?结果又会是怎样?哈哈哈,不用猜啦,我全部都试过一遍,结果与上面完全一致!

似乎我的分享也该结束了!不,我要加班!哦不对!我热爱学习,热爱加班!继续整理干货!

总结

对于复合索引 idx_A_B_C

有A、A and B、B and A、C and A、A and C、A and B and C、B and A and C、C and B and A 会走索引.

注意: or 不走索引 C and B or A 或者 A and B or C  或者 A and (B or C) 不走索引.

喜欢的话记得点个赞或者加个关注


浏览 20
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报