前言
想的再多,不如行动起来,大家好,我是啊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路搜索树,它要么是空的,要么满足以下属性:
- B树的所有叶子节点都处于同一级别,即它们具有相同的深度(树的高度)。
-
- 上述列子中所有节点有一同一个高度,都是3。
- B树的每个节点的键(在多个键的情况下)应按升序存储。
-
- 键存储为[19,22](升序)
- 在B树中,所有非叶节点(根节点除外)至少应有m/2个子节点。
-
- 上列子中5/2=2。所以能看出非叶子结点(第二排)至少有2个字节点。
- 所有节点(根节点除外)应该至少有m/2 - 1 个键。
-
- 上诉列子中至少有一个键。
- 如果根节点是叶节点(树中的唯一节点),那么它将没有子节点并且至少有一个键。如果根节点是非叶节点,那么它至少有2 个子节点和至少一个键。
- 具有 n-1 个键值的非叶节点应该有 n 个非 NULL 子节点。
bTree的作用
- B树是M路树的扩展。B 树是自平衡的,而 M 路树可以是平衡的、倾斜的或任何方式的。在外部存储的情况下,需要更快的访问。与普通的二叉搜索树相比,M 路树可以更有效地帮助简化对外部存储的搜索。但是,由于 B 树的自平衡特性,它的层次较少,因此 B 树在很大程度上缩短了访问时间。
- B树有助于有序的顺序访问,并在有数百万条记录时简化记录的插入和删除。这是可能的,因为 B 树的高度降低和平衡的性质。
BTree如何搜索
- 搜索从根节点开始。将搜索元素 k 与根进行比较。
1.1. 如果根节点包含 k ,则搜索完成。
1.2. 如果 k < 根中的第一个值,我们移动到最左边的 chld 并递归地搜索孩子。
1.3.1. 如果根节点只有 2 个 孩子,则移动到最右边的孩子并递归搜索该孩子。
1.3.2. 如果根有超过 2 个 键,则搜索其余的。 - 如果在遍历整棵树后没有找到 k,则搜索元素不存在于 B Tree 中。
还是拿上图的列子还说明:假设我们要在B 树中搜索一个键k=18的记录。
- 我们首先检查根,发现这里不存在
k=20。所以我们移动到根节点的子节点上。因为这里有 2 个孩子,所以我们比较2 个键。 - 由于k>17,转到根节点的右孩子。
- 将k与节点的值进行比较,即19和22。由于
k<19(即左键),我们移动到34的左孩子。 - 由于 19 的左孩子中的值
k = 18,我们可以说找到了键k并且搜索完成。 - 如果查找的是21的话,那么查找过程相似,只是查找失败。
BTree和B+Tree的区别
BTree和B+tree是两种常见的树形数据结构,常用于数据库索引。他们的区别如下:
- B+tree的数据指针存储在叶子结点上,而BTree的数据指针则存在于 B 树的内部、叶或根节点。
- 叶子在 B 树上不相互连接,而在 B+ 树上相互连接。
总体来说,B+tree的结构用作于数据库索引比BTree更优。
- 磁盘IO次数更少:B+Tree中内部节点只包含索引键,而数据记录存储在叶节点中。这意味着在查找数据记录时,这样一来一次性读入内存的索引key也就越多,相对来说IO读写次数也就降低了
- 数据查询效率更高:B+Tree中所有叶节点形成一个有序链表,可以使用区间扫描进行范围查询。而B-Tree需要遍历整棵树来获取所有的数据记录,不适合进行范围查询。
- 更少的内存开销:B+Tree中每个内部节点仅包含索引键,而B-Tree的内部节点同时包含索引键和数据记录。这意味着B+Tree可以使用更少的内存来存储相同数量的索引数据。
- 适合磁盘存储:由于B+Tree每个节点中只包含索引键,而叶节点存储数据记录,因此B+Tree适合在磁盘上存储大量数据。