Loading

B-树和B+树

date: 2020-09-06 13:34:00
updated: 2020-09-10 09:57:00

B-树和B+树

1. B-树

1.1 B-树就是B树

英文名字叫做B-tree,中间的短线是英文连接符,只是翻译的时候将短线翻译成了减号。
全称Balance-tree(平衡多路查找树),平衡的意思是左边和右边分布均匀。多路的意思是相对于二叉树而言的,二叉树就是二路查找树,查找时只有两条路,而B-tree有多条路,即父节点有多个子节点。

1.2 B-树用途

使用B-tree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度。这个数据结构一般用于数据库的索引,综合效率较高。

1.3 一个 m 阶的B-树的特征

  1. 根结点至少有两个子女。
  2. 每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m
  3. 每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m
  4. 所有的叶子结点都位于同一层。
  5. 每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。

2. B+树

2.1 一个 m 阶的B+树的特征

  1. 有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。
  2. 所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
  3. 所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。

每一个父节点的元素都出现在子节点中,是子节点的最大或最小元素。
根节点的最大元素等同于整个B+树的最大元素 => 无论插入删除多少元素,始终要保持最大元素在根节点中。
由于父节点元素都出现在子节点中,因此所有叶子节点包含所有的元素信息。

3. B-树和B+树对比

3.1 卫星数据

卫星数据指的是索引元素所指向的数据记录,比如数据库中的某一行。B-树所有节点都带有卫星数据。

B-树的卫星数据

B+树只有叶子节点带有卫星数据,其他节点仅仅是索引。

B+树的卫星数据

在数据库的聚集索引(Clustered Index)中,叶子节点直接包含卫星数据。在非聚集索引(NonClustered Index)中,叶子节点带有指向卫星数据的指针。

3.2 查询对比

  1. 由于B+树中间节点没有卫星数据,所以同样4KB大小的磁盘页可以容纳更多的节点元素(节点存储在文件中,节点中的卫星数据是在内存中的) => 在数据量相同的情况下,B+树的结构比B-树要更加矮胖,查询IO的次数也更少
  2. B+树的查询必须最终查找到叶子节点,而B-树只要找到匹配元素即可,所以B-树查找性能不稳定,最好情况是只查到根节点,最坏情况是查到叶子节点。而B+树每一次查找都是稳定的。
  3. 范围查询时,B-树要通过中序遍历来确定范围,但是B+树可以直接通过链表来查询范围

利用平衡树的优势加快查询的稳定性和速度;
B+树的数据都存储在叶子结点中,分支结点均为索引,查询时只需要扫描叶子节点,常用于数据库索引;

B树其分支结点和叶子节点都存储着数据,查询时需要进行一个遍历,常用于文件索引;

B树:二叉树,每个结点只存储一个关键字,等于则命中,小于走左结点,大于走右结点;

B-树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点;所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;

B+树:在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中;

posted @ 2020-10-22 11:19  猫熊小才天  阅读(145)  评论(0编辑  收藏  举报