联合索引(复合索引)在B+树上的结构


这几天看了B系列树和数据库索引相关的一些知识,看完这篇文章之后《MySQL索引背后的数据结构及算法原理

收获很大,了解了很多知识,随后也产生了一个想法:联合索引 对应的 B+ 树 是一个什么样子的结构。带着这个想法各种百度

也没得到自己想要的答案,那我就把我的想法写下来。

对于这块知识,我也是刚入门,如果有大神看到我的想法不对,还请多多指正。


这里以MySql INNODB为例,MyISAM道理是一样的。然后先从原文搬几个图过来:


这是一张表格,col1 是主建,col2和col3 是普通字段。那么主索引 对应的 B+树 结构是这样子的:



扫描二维码关注公众号,回复: 3298210 查看本文章

也可以是这样子的,这是我画的:



现在呢,对col3 建立一个单列索引,原文图:



看完这个图也是可以理解的,那么想法来了,如果对 col3 和 col2 建立 联合索引,那么 B+ 树会是一个什么样子的呢?

首先可以肯定的是,肯定只有一棵树,又因为 最左原则的存在,那么带着这个想法自己试着画了下:


建索引语句 CREATE INDEX IDX_XXX ON TABLE(COL3, COL2);

先根据col3 排序,在根据 col2 排序,如上图。

原文例子中的数据没有重复数据,为了更好的理解,我自己改了下:


红色框是改动的地方,把col3 改成有重复数据了,然后 还是对 col3 ,col2建立联合索引,那么 B+树 如下:


红色框是和原来不一样的地方。

联合索引在查找的时候,比如要找 Alice,34 这条记录 WHERE COL3 = 'Alice' AND COL2 = 34

先根据col3 查找 Alice ,找到了2条记录,在根据col2 查找 34,然后获取到主键 15 ,在根据主键去查找 主索引。

如果 是 WHERE COL2 = 34,由于只有联合索引 (col3, col2),没有col2 的单列索引。

那么查找的时候,就没法根据上面的这棵树来查找 ,只能全表扫描。

所以为什么会有最左原则,就是因为 B+树 是根据最左边的字段构建的,我的想法是这样子的。

如果不对,一定要帮忙批评指正啊。



猜你喜欢

转载自blog.csdn.net/klchht/article/details/78146443