请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老师您好,没有理解 `mysql会一直向右匹配知道遇到范围查询就停止匹配` 这段话

老师您好,我没有特别理解

mysql会一直向右匹配知道遇到范围查询就停止匹配

这段话。

根据您课程中的例子,比如查询语句是:where a=3 and b=4 and c>5 and d=6,我个人对上面的话的理解是:
第一个查询条件 a 不是范围查询,于是继续向右匹配; b 也不是范围查询,到了 c, c 是范围查询,于是停止匹配,因此,d 用不到索引。

如果这样理解的话,好像跟索引的顺序没什么关系啊,有关系的是查询条件的顺序啊,为什么将索引的顺序改成 (a,b,d,c) 就可以都用到索引了呢? 到了 c, 不应该是范围查询,停止匹配吗?

正在回答

1回答

同学好,最左前缀匹配原则是非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如上面同学说的a = 3 and b = 4 and c > 5 and d = 6 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。

首先,在进行数据检索之前,表肯定是已经建立好了的,并且索引也已经是建立起来了的,此时如果索引是按照(a,b,c,d)这样子的顺序去创建的话,你查询的时候,如果c用了范围查询,那么上面的这个语句将匹配不到这个索引(具体可以explain看看),只能匹配联合索引(a,b,c)(前提是已经创建了的话)。

但是如果你原本索引建立的顺序用的是(a,b,d,c)创建的,则根据遇到范围查询就终止的原则,匹配到了(a,b,d,c)这个索引,同学可以试试。此外,是否匹配索引肯定是和查询条件相关,但是指令会被优化,也就是查询条件的先后顺序无所谓,比如你执行where a=3 and b=4  and d=6 and c>5  但是索引是(a,b,c,d),照样是没法匹配的

2 回复 有任何疑惑可以回复我~
  • 提问者 Yoooshiki #1
    谢谢老师,我理解这个意思了,跟条件语句后面的顺序没关系的,而是从索引的顺序出发,从左到右检测该字段是否在当前 sql 中使用了范围查询作为条件
    回复 有任何疑惑可以回复我~ 2019-01-07 12:53:36
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信