20200415——联合索引与最左匹配原则

联合索引

INDEX idx_test(col_a, col_b)

这种包含多个字段的索引就叫做“联合索引”

新华字典里还有一种目录被称为“部首目录”,下面可以看到,要使用这个目录我们首先会根据部首的笔画数找到对应该能的部分,然后可以在里面找到我们想找的部首。比如如果我们还是要找
在这里插入图片描述
找到部首后,右边的页码还不是险字真正的页码,我们还需要根据右边的页码找到对应部首在检字表中的位置。找到第93页的检字表后我们就可以根据险字余下的笔画数(7画)在“6-8画”这一部分里找到险字真正的页码了。

在这里插入图片描述
在这个过程中,我们按顺序使用了“两个目录”,一个叫做“部首目录”,一个叫做“检字表”。并且我们可以看到上图中检字表的内容都是按部首分门别类组织的。这两个部分合在一起就是我们在本节讨论的主题——联合索引。即通过第一个字段的值(部首)在第一级索引中找到对应的第二级索引位置(检字表页码),然后在第二级索引中根据第二个字段的值(笔画)找到符合条件的数据所在的位置(险字的真正页码)。

最左前缀匹配

从前面使用部首目录的例子中可以看出,如果我们不知道一个字的部首是什么的话,那基本是没办法使用这个目录的。这说明仅仅通过笔画数(第二个字段)是没办法使用部首目录的。

这就引申出了联合索引的一个规则:联合索引中的字段,只有某个字段(笔画)左边的所有字段(部首)都被使用了,才能使用该字段上的索引。例如,有索引INDEX idx_i1(col_a, col_b),如果查询条件为where col_b = 1,则无法使用索引idx_i1。

这里也就是说,如果想用到索引b,那么这个查询条件中必须用到了a,才能包括b

但是如果我们知道部首但是不知道笔画数,比如不知道“横折竖弯勾”是算一笔还是两笔,那我们仍然可以使用“部首目录”部分的内容,只是要把“检字表”对应部首里的所有字都看一遍就能找到我们要找的字了。

这就引申出了联合索引的另一个规则:联合索引中的字段,即使某个字段(部首)右边的其他字段(笔画)没有被使用,该字段之前(含)的所有字段仍然可以正常使用索引。例如,有索引INDEX idx_i2(col_a, col_b, col_c),则查询条件where col_a = 1 and col_b = 2在字段col_a和col_b上仍然可以走索引。

但是,如果我们在确定部首后,不知道一个字到底是两画还是三画,这种情况下我们只需要在对应部首的两画和三画部分中找就可以了,也就是说我们仍然使用了检字表中的内容。所以,使用范围条件查询时也是可以使用索引的。

最后,我们可以完整地表述一下最左前缀匹配原则的含义:对于一个联合索引,如果有一个SQL查询语句需要执行,则只有从索引最左边的第一个字段开始到SQL语句查询条件中不包含的字段(不含)或范围条件字段(含)为止的部分才会使用索引进行加速。

发布了983 篇原创文章 · 获赞 43 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq_36344771/article/details/105547336