这几天看了B系列树和数据库索引相关的一些知识,看完这篇文章之后《MySQL索引背后的数据结构及算法原理
》
收获很大,了解了很多知识,随后也产生了一个想法:联合索引 对应的 B+ 树 是一个什么样子的结构。带着这个想法各种百度
也没得到自己想要的答案,那我就把我的想法写下来。
对于这块知识,我也是刚入门,如果有大神看到我的想法不对,还请多多指正。
这里以MySql INNODB为例,MyISAM道理是一样的。然后先从原文搬几个图过来:
这是一张表格,col1 是主建,col2和col3 是普通字段。那么主索引 对应的 B+树 结构是这样子的:
也可以是这样子的,这是我画的:
现在呢,对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+树 是根据最左边的字段构建的,我的想法是这样子的。
如果不对,一定要帮忙批评指正啊。