B+Tree的演化

1、B+Tree的演化

        B+Tree是从最早的平衡二叉树演化而来的,其中的B是(balance),不是二叉(binary)。在讲B+Tree之前要先了解二叉查找树,平衡二叉树(AVLTree),平衡多路查找树(B-Tree),B+Tree是从这些结构演化而来的。

1、二叉查找树

二叉树性质:左子树的键值小于根的键值,右子树的键值大于根的键值。

上两图同为二叉查找树,对二叉树节点进行查找,深度为1的节点查找次数为1,深度为2节点查找次数为2,深度为n的节点查找次数为n,因此上图左一平均查找次数为(1+2+2+3+3+3)/6=2.3次。 二叉树可以随意构造(上图右),它的查找次数为(1+2+3+4+5+5)/6=3.3次,但是这样查询效率会变低,因此引入了平衡二叉树。

2、平衡二叉树

平衡二叉树是在符合二叉树的前提下,还满足任何节点的两个子树的高度最大差为1(任意两个叶子节点的高度差不大于1)。如下图

3、平衡多路查找树 (B-Tree)

B树是一种多路自平衡查找树,类似普通的二叉树,但是B树允许每个节点有更多的子节点。

一棵m阶的B-Tree特性:

1.每个节点最多有m个子节点。

2.除了根节点和叶子节点外,其他每个节点至少有Ceil(m/2)(向上取整)个子节点。 

3.若根节点不是叶子节点,则至少有两个子节点。

4.所有叶子节点都在同一层,且不包含其他关键字信息。

5.每个非叶子节点包含n个关键字信息(P0,P1,P2...,Pn, K1,K2,..,Kn)。

6.关键字的个数n满足:ceil(m/2)1<= n <= m-1。

7.ki(i=1...n)为关键字,且关键字升序排序。

8.Pi(i=1...n)为指向子节点的父节点的指针。

 

每个节点占用一个盘块的磁盘空间,一个节点上有两个升序排序的关键字和三个指向子树根节点的指针,指针存储的是子节点所在磁盘块的地址。两个关键字划分成的三个范围域对应三个指针指向子树的数据范围域。以根节点为例,关键字为17和35,P1指针指向的子树的数据范围为小于17,P2指针指向的子树的数据范围为17~35,P3指针指向的子树的数据范围为大于35。

模拟查找关键字29的过程:

根据根节点找到磁盘块1,读入内存。【磁盘I/O操作第1次】
比较关键字29在区间(17,35),找到磁盘块1的指针P2。
根据P2指针找到磁盘块3,读入内存。【磁盘I/O操作第2次】
比较关键字29在区间(26,30),找到磁盘块3的指针P2。
根据P2指针找到磁盘块8,读入内存。【磁盘I/O操作第3次】
在磁盘块8中的关键字列表中找到关键字29。

B-Tree需优化的点:

1.每个节点中有key,也有data,而每一个页的存储空间是有限的,如果data数据较大时就会导致每个节点(即一个页)能存储的key的数量很小。

2.当存储的数据量很大时,同样1会导致B-Tree的深度较大,增加查询时的磁盘I/O次数,进而影响查询效率。

4、B+Tree

B+Tree是通过B-Tree优化而来,主要是将非叶子节点存储的data值放到叶子节点上,而非叶子节点存储的都是key值。总结有一下三点:

1.非叶子节点只存储键值信息。

2.所以叶子节点都有一个链指针。

3.数据记录都存放在叶子节点中。

4.叶子节点是顺序排序的,并且相邻节点具有顺序引用的关系。

 通常在B+Tree上有两个头指针,一个指向根节点,另一个指向关键字最小的叶子节点,而且所有叶子节点(即数据节点)之间是一种链式环结构。因此可以对B+Tree进行两种查找运算:一种是对于主键的范围查找和分页查找,另一种是从根节点开始,进行随机查找。可能上面例子中只有22条数据记录,看不出B+Tree的优点,下面做一个推算:InnoDB存储引擎中页的大小为16KB,一般表的主键类型为INT(占用4个字节)或BIGINT(占用8个字节),指针类型也一般为4或8个字节,也就是说一个页(B+Tree中的一个节点)中大概存储16KB/(8B+8B)=1K个键值(因为是估值,为方便计算,这里的K取值为〖10〗^3)。也就是说一个深度为3的B+Tree索引可以维护10^3 * 10^3 * 10^3 = 10亿 条记录。

实际情况中每个节点可能不能填充满,因此在数据库中,B+Tree的高度一般都在2~4层。mysql 的InnoDB存储引擎在设计时是将根节点常驻内存的,也就是说查找某一键值的行记录时最多只需要1~3次磁盘I/O操作。数据库中的B+Tree索引可以分为聚集索引(clustered index)和辅助索引(secondary index)。上面的B+Tree示例图在数据库中的实现即为聚集索引,聚集索引的B+Tree中的叶子节点存放的是整张表的行记录数据。辅助索引与聚集索引的区别在于辅助索引的叶子节点并不包含行记录的全部数据,而是存储相应行数据的聚集索引键,即主键。当通过辅助索引来查询数据时,InnoDB存储引擎会遍历辅助索引找到主键,然后再通过主键在聚集索引中找到完整的行记录数据。

5、知识拓展 -- 红黑树(R-B Tree)

红黑树是一种特殊的二叉查找树,它的每个节点上都有存储位表示节点的颜色,可以是红或黑。

特性:1、每个节点或者是红色或者是黑色。

           2、根节点是黑色。

           3、每个叶子节点是黑色(是指为空的叶子节点)。

           4、如果一个节点是红色,则它的子节点必须是黑色。

           5、从一个节点到该节点的子孙节点的所以路径上包含相同数目的黑节点。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值