Btree和B+tree

187 阅读5分钟

前言

想的再多,不如行动起来,大家好,我是啊Q,让我们徜徉在知识的海洋里吧。

一起“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第14天, 点击查看活动详情

上一篇章我们介绍了 索引的基本概念, 今天我们就以mysql数据库为列子,来分析一下mysql中用Btree和B+Tree的相关知识。

索引有哪些数据结构?

mysql提供了的索引按数据结构划分有以下几种:BTree索引(B-Tree或B+Tree索引),Hash索引,full-index全文索引。BTree索引是我们最常用到的索引结构。今天我们着重分析一下。

BTree

首先我们来了解一些定义:

M路树:M 路树(多路搜索树)最多可以产生 m 个子树。二叉树则最多可以有2个子树。

叶子节点:一棵树当中没有子结点(即度为0)的结点,称为叶子结点,简称“叶子”

非叶子结点:如果不是叶子节点,则既是非叶子结点。

BTree的概念:B树(高度平衡的 m 路搜索树)是一种特殊类型的M 路树,它可以自我平衡。

BTree的时间复杂度:O(log n)

上图是一个5阶(5路)B 树的例子。它的根部有[6,17] 。小于 6 的4落在左孩子中。12 小于17且大于 6 是中间的孩子。[19,22]大于17的是最右边的孩子。当我们沿着树向下走时,遵循相同的过程。

BTree的性质

m阶 B 树可以定义为 m路搜索树,它要么是空的,要么满足以下属性:

  1. B树的所有叶子节点都处于同一级别,即它们具有相同的深度(树的高度)。
    1. 上述列子中所有节点有一同一个高度,都是3。
  1. B树的每个节点的键(在多个键的情况下)应按升序存储。
    1. 键存储为[19,22](升序)
  1. 在B树中,所有非叶节点(根节点除外)至少应有m/2个子节点。
    1. 上列子中5/2=2。所以能看出非叶子结点(第二排)至少有2个字节点。
  1. 所有节点(根节点除外)应该至少有m/2 - 1 个键。
    1. 上诉列子中至少有一个键。
  1. 如果根节点是叶节点(树中的唯一节点),那么它将没有子节点并且至少有一个键。如果根节点是非叶节点,那么它至少有2 个子节点和至少一个键。
  2. 具有 n-1 个键值的非叶节点应该有 n 个非 NULL 子节点。

bTree的作用

  1. B树是M路树的扩展。B 树是自平衡的,而 M 路树可以是平衡的、倾斜的或任何方式的。在外部存储的情况下,需要更快的访问。与普通的二叉搜索树相比,M 路树可以更有效地帮助简化对外部存储的搜索。但是,由于 B 树的自平衡特性,它的层次较少,因此 B 树在很大程度上缩短了访问时间。
  2. B树有助于有序的顺序访问,并在有数百万条记录时简化记录的插入和删除。这是可能的,因为 B 树的高度降低和平衡的性质。

BTree如何搜索

  1. 搜索从根节点开始。将搜索元素 k 与根进行比较。
    1.1. 如果根节点包含
    k ,则搜索完成。
    1.2. 如果
    k < 根中的第一个值,我们移动到最左边的 chld 并递归地搜索孩子。
    1.3.1. 如果根节点只有
    2 个 孩子,则移动到最右边的孩子并递归搜索该孩子。
    1.3.2. 如果根有超过
    2 个 键,则搜索其余的。
  2. 如果在遍历整棵树后没有找到 k,则搜索元素不存在于 B Tree 中。

还是拿上图的列子还说明:假设我们要在B 树中搜索一个键k=18的记录。

  1. 我们首先检查根,发现这里不存在 k=20。所以我们移动到根节点的子节点上。因为这里有 2 个孩子,所以我们比较2 个键。
  2. 由于k>17,转到根节点的右孩子。
  3. 将k与节点的值进行比较,即19和22。由于k<19(即左键),我们移动到34的左孩子。
  4. 由于 19 的左孩子中的值 k = 18,我们可以说找到了键k并且搜索完成。
  5. 如果查找的是21的话,那么查找过程相似,只是查找失败。

BTree和B+Tree的区别

BTree和B+tree是两种常见的树形数据结构,常用于数据库索引。他们的区别如下:

  • B+tree的数据指针存储在叶子结点上,而BTree的数据指针则存在于 B 树的内部、叶或根节点。
  • 叶子在 B 树上不相互连接,而在 B+ 树上相互连接。

总体来说,B+tree的结构用作于数据库索引比BTree更优。

  1. 磁盘IO次数更少:B+Tree中内部节点只包含索引键,而数据记录存储在叶节点中。这意味着在查找数据记录时,这样一来一次性读入内存的索引key也就越多,相对来说IO读写次数也就降低了
  2. 数据查询效率更高:B+Tree中所有叶节点形成一个有序链表,可以使用区间扫描进行范围查询。而B-Tree需要遍历整棵树来获取所有的数据记录,不适合进行范围查询。
  3. 更少的内存开销:B+Tree中每个内部节点仅包含索引键,而B-Tree的内部节点同时包含索引键和数据记录。这意味着B+Tree可以使用更少的内存来存储相同数量的索引数据。
  4. 适合磁盘存储:由于B+Tree每个节点中只包含索引键,而叶节点存储数据记录,因此B+Tree适合在磁盘上存储大量数据。