数据库索引为什么使用B树(B+树)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010318270/article/details/88806428

动态查找树主要包括:二叉搜索树、平衡二叉树、红黑树、B树,通过对树高度的降低可以提升查找效率。
B树定义:
一颗m阶的B树满足下列条件:

(1)每个节点至多有m棵子树
(2)除根节点外,其他每个分支节点至少有[m/2]棵子树
(3)根节点至少有两棵子树(除非B树只包含一个节点)
(4)所有叶节点在同一层上。B树叶节点可以看成一种外部节点,不包含任何信息
(5)有j个孩子的非叶子节点恰好有j-1个关键码,关键码按递增次序排列。

B+树定义:
B+树是B树的一种变形,内部节点只存关键字和子节点指针,而把数据都存储在叶子节点,并且叶子节点通过指针自小而大连接在一起。

Q1:B树与红黑树的区别
区别:B树的节点可以有多个子节点,RB树每个节点只有两个子节点。
相同:一颗含有n个节点的B树高度和RB树是一样的,都是O(lgn)。

Q2:B树与B+树的区别
(1)B+树只有叶子节点会带有指向记录的指针(带数据),而B树则所有节点都带有。
(2)B+树中所有叶子节点都是通过指针连接在一起的,而B树不会。
B+树的优点:
(1)非叶子节点不带数据,这样一个块可以容纳更多的索引项,一是可以降低树的高度,二是一个内部节点可以定位更多的叶子节点。
(2)叶子节点之间通过指针连接,范围扫描将十分简单。而对于B树来说,则需要在叶子节点和内部节点间不停的往返移动。
B树的优点:
  对于在内部节点的数据,可直接得到,不必根据叶子节点来定位。

Q3:数据库索引中为什么使用B树(B+树)
    一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上,这样,索引查找过程中就要产生磁盘IO消耗。因此,选择数据结构时,索引的结构组织要尽量减少查找过程中磁盘IO的存取次数。
    磁盘预读可以通过IO效率(局部性原理),预读的长度一般为页的整数倍。数据库系统巧妙利用了磁盘预读原理,将一个节点的大小设为一个页,这样每个节点只需要一次IO就可以完全载入。每次新建节点时,直接申请一个页的空间,这样就保证了一个节点物理上也存储在一个页,加之计算机存储分配都是按页对齐的,就实现了一个节点只需要一次IO。
    B树中一次检索最多需要h-1次IO(根节点常驻内存),渐进复杂度为O(h)=O(logdN)。一般应用中,出度d是非常大的数字,因此h非常小(通常不超过3)。红黑树这种结构,h明显要深的多,由于逻辑上很近的节点(父子)物理上可能很远,无法利用局部性。红黑树的IO渐进复杂度也为O(h),效率明显比B树差很多。

  B+树更适合外索引,原因和内节点出度d有关,d越大索引性能越好,而出度的上线取决于节点内key和data的大小,由于B+树内节点去掉了data域,因此可以拥有更大的出度,拥有更好的性能。
dmax = floor(pagesize / (keysize + datasize + pointsize))   (pagesize – dmax >= pointsize)

猜你喜欢

转载自blog.csdn.net/u010318270/article/details/88806428