老师您好,没有理解 `mysql会一直向右匹配知道遇到范围查询就停止匹配` 这段话
来源:3-9 索引额外问题之最左匹配原则的成因
Yoooshiki
2019-01-05
老师您好,我没有特别理解
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),照样是没法匹配的
212019-01-07
相似问题