B+Tree是B树的变种,有着比B树更高的查询性能,来看下m阶B+Tree特征:算法
一、有m个子树的节点包含有m个元素(B-Tree中是m-1)数据库
二、根节点和分支节点中不保存数据,只用于索引,全部数据都保存在叶子节点中。性能
三、全部分支节点和根节点都同时存在于子节点中,在子节点元素中是最大或者最小的元素。spa
四、叶子节点会包含全部的关键字,以及指向数据记录的指针,而且叶子节点自己是根据关键字的大小从小到大顺序连接。3d
一、红点表示是指向卫星数据的指针,指针指向的是存放实际数据的磁盘页,卫星数据就是数据库中一条数据记录。指针
二、叶子节点中还有一个指向下一个叶子节点的next指针,因此叶子节点造成了一个有序的链表,方便遍历B+树。blog
B+树的查找元素3的过程:索引
第一次磁盘IO遍历
第二次磁盘IOim
第三次磁盘IO
这个过程看下来,貌似与B树的查询过程没有什么区别。但实际上有两点不同:
a、首先B+树的中间节点不存储卫星数据,因此一样大小的磁盘页能够容纳更多的节点元素,如此一来,相同数量的数据下,B+树就相对来讲要更加矮胖些,磁盘IO的次数更少。
b、因为只有叶子节点才保存卫星数据,B+树每次查询都要到叶子节点;而B树每次查询则不同,最好的状况是根节点,最坏的状况是叶子节点,没有B+树稳定。
B树范围查找3-8的过程
a、先查找3
b、再查找四、五、六、七、8,中间过程省略,直接到8的查找
这里查找的范围跨度越大,则磁盘IO的次数越多,性能越差。
B+树范围查找3-11的过程
先从上到下找到下限元素3,而后经过链表指针,依次遍历获得元素5/6/8/9/11;如此一来,就不用像B树那样一个个元素进行查找。
1.单节点能够存储更多的元素,使得查询磁盘IO次数更少。
2.全部查询都要查找到叶子节点,查询性能稳定。
3.全部叶子节点造成有序链表,便于范围查询。
PS:在数据库的汇集索引(Clustered Index)中,叶子节点直接包含卫星数据。在非汇集索引(NonClustered Index)中,叶子节点带有指向卫星数据的指针。
参考文献:
【1】很直观的图:http://www.jianshu.com/p/6f68d3c118d6
【2】《算法导论》