Btree/B+tree

B-tree

  • 什么是B-tree
    • B-tree是一种多路自平衡搜索树,它类似普通的二叉树,但是Btree允许每个节点有更多的子节点。Btree示意图如下:

在这里插入图片描述

  • 由上图可知 B-tree 的一些特点:
  1. 所有键值分布在整个树中

  2. 任何关键字出现且只出现在一个节点中

  3. 搜索有可能在非叶子节点结束

  4. 在关键字全集内做一次查找,性能逼近二分查找算法
    在这里插入图片描述
    来模拟下查找文件29的过程:

    (1) 根据根结点指针找到文件目录的根磁盘块1,将其中的信息导入内存。【磁盘IO操作1次】

    (2) 此时内存中有两个文件名17,35和三个存储其他磁盘页面地址的数据。根据算法我们发现17<29<35,因此我们找到指针p2。

    (3) 根据p2指针,我们定位到磁盘块3,并将其中的信息导入内存。【磁盘IO操作2次】

    (4) 此时内存中有两个文件名26,30和三个存储其他磁盘页面地址的数据。根据算法我们发现26<29<30,因此我们找到指针p2。

    (5) 根据p2指针,我们定位到磁盘块8,并将其中的信息导入内存。【磁盘IO操作3次】

    (6) 此时内存中有两个文件名28,29。根据算法我们查找到文件29,并定位了该文件内存的磁盘地址。

  • 用途

    • 数据库中存取和查找文件(称为记录或键值)的一种方法

B+tree

B+树是B树的变体,也是一种多路平衡查找树,B+树的示意图为:
在这里插入图片描述
由图可看出B+tree的特点 同时也是 B-tree 和 B+tree的区别

  1. 所有关键字存储在叶子节点,非叶子节点不存储真正的data
  2. 为所有叶子节点增加了一个链指针
  3. 层级更低,IO 次数更少
  4. 每次都需要查询到叶子节点,查询性能稳定
  5. 叶子节点形成有序链表,范围查询方便
B-tree/B+tree区别

1、B+tree的所有关键字存储在叶子节点,非叶子节点不存储真正的data。

​ 2、B+tree为所有叶子节点增加了一个链指针。

​ 3、B+tree支持叶子节点的延展性(横向性)

为什么mysql的索引使用B+树而不是B树呢??

(1)B+树更适合外部存储(一般指磁盘存储),由于内节点(非叶子节点)不存储data,也就是说使用B+树单次磁盘IO的信息量相比较B树更大,IO效率更高。

(2)mysql是关系型数据库,经常会按照区间来访问某个索引列,B+树的叶子节点间按顺序建立了链指针,加强了区间访问性,所以B+树对索引列上的区间范围查询很友好。而B树每个节点的key和data在一起,无法进行区间查找。

在数据库中,B-Tree B+Tree 是两种常见的索引数据结构,它们在设计上各有特点,适用于不同的查询场景。以下是 B-Tree B+Tree 索引在数据库中的主要区别: ### 节点结构 - **B-Tree**:每个节点既包含键值,也包含对应的数据记录,这意味着非叶子节点也可以存储数据[^4]。 - **B+Tree**:非叶子节点仅包含键值指向子节点的指针,而不存储实际的数据记录。数据记录仅存储在叶子节点中[^4]。 ### 叶子节点 - **B-Tree**:叶子节点包含键值对应的数据记录,叶子节点之间通过指针连接[^4]。 - **B+Tree**:叶子节点不仅包含数据记录,还包含指向相邻叶子节点的指针,形成一个有序链表。非叶子节点则包含所有键值[^4]。 ### 范围查询 - **B-Tree**:由于在非叶子节点叶子节点都存储键值,对范围查询有一定的优势[^4]。 - **B+Tree**:因为只在叶子节点存储数据,范围查询效率更高,因为只需要遍历叶子节点[^4]。 ### 数据查找 - **B-Tree**:查找可以在非叶子节点中终止,因为数据可能存储在非叶子节点中[^4]。 - **B+Tree**:查找总是在叶子节点中完成,因为数据只存储在叶子节点中[^4]。 ### 插入删除 - **B-Tree**:插入删除时需要更新非叶子节点叶子节点,可能导致树的重平衡[^4]。 - **B+Tree**:插入删除只涉及到叶子节点,不需要更新非叶子节点,有助于减少维护的开销[^4]。 ### 应用场景 - **B-Tree**:适用于需要在非叶子节点中存储数据的场景,如某些文件系统[^4]。 - **B+Tree**:适用于数据库索引等场景,特别是范围查询顺序遍历较为频繁的情况。 ### 数据库中的具体应用 - **B-Tree**:在数据库中,B-Tree 索引通常用于支持等值查询部分范围查询[^1]。 - **B+Tree**:B+Tree 特别适合数据库索引,因为它能够有效地支持范围查询顺序扫描[^2]。此外,数据库中的 B+Tree 索引可以分为聚集索引(clustered index)辅助索引(secondary index)。聚集索引的 B+Tree 中的叶子节点存放的是整张表的行记录数据;而辅助索引的叶子节点并不包含行记录的全部数据,而是存储相应行数据的聚集索引键,即主键[^3]。 ### 示例代码 以下是一个简单的 Python 示例,模拟了 B+Tree 的基本结构: ```python class Node: def __init__(self, is_leaf=False): self.keys = [] self.children = [] self.is_leaf = is_leaf self.next = None # 用于叶子节点之间的链接 class BPlusTree: def __init__(self, order): self.root = Node(True) self.order = order # B+Tree的阶数 def insert(self, key): # 插入逻辑 pass def search(self, key): # 搜索逻辑 pass # 创建一个B+Tree实例 b_plus_tree = BPlusTree(3) ``` 这段代码定义了一个简单的 B+Tree 结构,其中 `Node` 类表示树中的节点,`BPlusTree` 类负责管理树的操作。 ### 总结 B-Tree B+Tree 在数据库索引中有各自的优势适用场景。B+Tree 由于其高效的范围查询能力顺序扫描特性,成为了大多数数据库系统中默认的索引结构。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值