MySql B-Tree 与B+Tree

177 阅读3分钟

都是多路平衡二叉树

B树分阶,代表每个节点能有多少子节点,每个节点能存的数据为:m/2

 m:阶 。例如一个五阶的b树的节点最少要有2个关键字,最多有4个关键字  根节点至少一个关键字

不同之处:

B树(B-树):

    1.每个节点都可以存放索引以及数据(K-V)

    2.所有的叶子节点都位于同一层(根节点到每一个叶子节点的长度都相同)

B+树 :

   1.两种数据结构,1.内部节点(存放索引) 2.叶子节点(存放数据)

   2.每个叶子节点都存放相邻节点的指针()

   3.父节点存有右孩子的第一个元素的索引

B+树优点:

   1.单一节点存储的数据更多,使查询的IO次数更少

   2.所有的查询都要查找到叶子节点,查询性能是稳定的,而B树,每个节点都可以查找到数据,所以不稳定。

  3.叶子节点形成一个有序链表,更便于查找

1.B+树内节点不存储数据,所有 data 存储在叶节点导致查询时间复杂度固定为 log n。而B-树查询时间复杂度不固定,与 key 在树中的位置有关,最好为O(1)。 如下所示B-树/B+树查询节点 key 为 50 的 data。

clipboard (1).png

只需一次IO就能查到数据,时间复杂度为(0)1

clipboard (2).png

B+树所有的 data 域都在根节点,所以查询 key 为 50的节点必须从根节点索引到叶节点,时间复杂度固定为 O(log n)。

2.B+树叶节点两两相连可大大增加区间访问性,可使用在范围查询等,而B-树每个节点 key 和 data 在一起,则无法区间查找。

clipboard (3).png

根据空间局部性原理:如果一个存储器的某个位置被访问,那么将它附近的位置也会被访问。

B+树可以很好的利用局部性原理,若我们访问节点 key为 50,则 key 为 55、60、62 的节点将来也可能被访问,我们可以利用磁盘预读原理提前将这些数据读入内存,减少了磁盘 IO 的次数。

当然B+树也能够很好的完成范围查询。比如查询 key 值在 50-70 之间的节点

3.B+树更适合外部存储。由于内节点无 data 域,每个节点能索引的范围更大更精确

由于B-树节点内部每个 key 都带着 data 域,而B+树节点只存储 key 的副本,真实的 key 和 data 域都在叶子节点存储。

一次磁盘 IO 会读取若干个 block,具体和操作系统有关,那么由于磁盘 IO 数据大小是固定的,在一次 IO 中,单个元素越小,量就越大。这就意味着B+树单次磁盘 IO 的信息量大于B-树,从这点来看B+树相对B-树磁盘 IO 次数少。

为什么MySql使用B+树?

1.B+树由于数据全部存储在叶子节点,并且通过指针串在一起,这样就很容易的进行区间遍历甚至全部遍历

2.其次B+树的查询效率更加稳定,数据全部存储在叶子节点,查询时间复杂度固定为 O(log n)。

3.B+树更适合外部存储。由于内节点无 data 域,每个节点能索引的范围更大更精确