数据结构--B树、B+树

数据结构--B树、B+树

  • 1. 什么是B树
  • 2.建立B树的要求
  • 3.什么是B+树
  • 4.Mysql里面为什么使用B+树作为索引结构?

1. 什么是B树

B树是一种数据结构,用于在硬盘或其他非易失性存储介质上快速存储和访问大量数据。它是一种平衡树,其每个节点可以存储多个键值对,而不仅仅是一个。B树通常用于需要频繁读写的数据库或文件系统中,因为它可以减少磁盘的访问次数,从而提高了性能。

B树有以下几个特点:

  • 每个节点可以存储多个键值对。这个数量通常称为节点的度数(degree)。
  • 所有叶节点都在同一层级上。这有助于保持树的平衡,使得在任何一个节点到达叶子节点的路径长度都相同。
  • 节点中的键值对是按照某种顺序排列的。这使得查找操作更加高效。
  • B树的高度相对于存储的关键字数来说非常小。因此,可以较快地定位到任何一个关键字。

一些常见的变体包括B+树和B*树,它们具有不同的性能特征和应用场景。
【动画版】数据结构-B树

数据结构--B树、B+树_第1张图片

2.建立B树的要求

建立B树的要求包括:

  1. 确定节点的度数:B树的节点可以存储多个关键字。度数是指每个节点最多可以存储的关键字数量。

  2. 确定关键字的排列方式:在节点中存储的关键字必须按照一定的方式进行排序,以便于查找和插入操作的执行。通常使用升序排列。

  3. 确定B树的最小度数:B树的最小度数定义为需要保证每个非根节点至少有t个关键字。根节点至少有一个关键字。

  4. 确定B树的最大度数:B树的最大度数定义为节点最多可以存储2t-1个关键字。根节点最多可以存储2t个关键字。

  5. 确定B树的高度:B树的高度应该尽可能小,以便于快速查找和插入。高度的计算公式为h <= logt(n+1),其中n为节点中关键字的数量,h为树的高度。

  6. 确定节点的分裂和合并规则:当一个节点的关键字数超过2t-1时,需要将它分裂成两个节点。如果一个节点的关键字数少于t-1时,则需要将它与相邻的节点合并成一个节点。

在实际应用中,我们可以通过递归算法实现B树的构建和操作。

3.什么是B+树

B+树是B树的一种变体结构,它与B树的不同之处在于:

  1. 只有叶子节点存储关键字:B+树中所有的内部节点仅用来索引,不存储具体的数据记录,只有叶子节点中才存储数据记录。这种特性使得B+树的磁盘读取更加高效,因为每个节点可以存储更多的索引。

  2. 叶子节点之间有指针相连:所有的叶子节点之间通过指针相连,形成一个有序链表。这个链表可以方便地支持范围查询,而且可以快速遍历整个数据集。

  3. 叶子节点的大小固定:所有的叶子节点都是同样大小的,因此可以预先分配好磁盘空间,避免频繁的磁盘动态分配。

B+树适用于需要频繁进行范围查询的场景,例如数据库系统中的索引。它可以利用叶子节点之间的有序链表,快速定位到满足条件的数据记录,并且具有更好的磁盘读取性能。

数据结构--B树、B+树_第2张图片

4.Mysql里面为什么使用B+树作为索引结构?

常规的索引引擎都会使用B树或者B+树作为索引引擎,因为B树是一种多路平衡树,用这种存储结构来存储大量数据的情况下,整体高度相比于二叉树来说会矮很多,而对于数据库来说所有的数据必然是存储在磁盘上的,而磁盘IO的效率实际上是很低的,特别是在随机磁盘IO的一个情况下,效率更低,所以树的高度就能够决定磁盘IO的一个次数,磁盘IO次数越少对性能的提升就越大。这也是为什么采用B树作为索引存储结构的原因。
但是在Mysql的Innodb存储引擎中,它采用的是一种增强的B树结构,B+树相比较于B树,B+树做了如下几个方面的优化。

  1. B+树的所有数据都存储在叶子节点上,非叶子节点只存储索引。(B+树非叶子节点不存储数据,所以每一层能够存储的索引数量会增加,因为着B+树在层高相同的情况下存储的数据量要比B树要多,使得磁盘IO次数更小)。
  2. 叶子节点中的数据使用双向链表进行关联。(Mysql中范围查询是一个比较常用的操作,而B+树的所有存储在叶子结点的数据使用了双向链表进行关联,所以在查询的时候只需要两个节点进行遍历就行,而B书需要获取所有节点,所以B+树在范围查询的效率上更高)。
  3. 在数据检索方面由于所有的数据都存储在叶子节点,所以B+树的IO次数会更加稳定一些。
  4. 因为叶子结点存储所有数据所以B+树的全局扫描能力更强一些,因为它只需要扫描叶子节点,但是B树需要遍历整个树。

你可能感兴趣的:(Mysql数据库,b树,数据结构)