【Mysql 底层原理】MySQL 索引原理:B-Tree 和 B+Tree 的区别与应用

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主

⛪️ 个人社区:个人社区
💞 个人主页:个人主页
🙉 专栏地址: ✅ Java 中级
🙉八股文专题:剑指大厂,手撕 Java 八股文

在这里插入图片描述

1. B-Tree 和 B+Tree 的基本概念

1. B-Tree(B树)的基本概念

定义

  • B-Tree 是一种自平衡的多路搜索树,其中每个节点可以有多个键和多个子节点。
  • B-Tree 的设计目的是为了在磁盘等外部存储设备上高效地进行查找、插入和删除操作。

节点结构

  • 每个节点包含若干个键(key)和指向子节点的指针(pointer)。
  • 节点中的键是有序排列的。
  • 所有叶子节点都在同一层,且不包含任何数据记录,只包含指向实际数据的指针。

平衡性

  • B-Tree 通过保持所有叶子节点在同一层来确保平衡。这意味着从根节点到任何一个叶子节点的路径长度都是相同的。
  • 插入和删除操作会自动调整树的结构以维持这种平衡性。

示例
假设有一个 2-3 树(一种特殊的 B-Tree),其中每个节点最多有两个键和三个子节点。一个简单的 2-3 树可能如下所示:

       [10, 20]
      /     |     \
  [5, 7]  [15, 18]  [25, 30]
  /  \    /  \    /  \
[1, 3] [6, 8] [14, 16] [28, 32]

2. B+Tree 的基本概念

定义

  • B+Tree 是 B-Tree 的变种,它在内部节点中只存储键和指向子节点的指针,而所有的数据记录都存储在叶子节点中。
  • B+Tree 也是自平衡的,并且所有叶子节点都在同一层。

节点结构

  • 内部节点:只包含键和指向子节点的指针。
  • 叶子节点:包含键和指向实际数据记录的指针,同时叶子节点之间通过指针链接起来,形成一个链表。
  • 叶子节点的链表结构使得范围查询更加高效。

平衡性

  • B+Tree 也通过保持所有叶子节点在同一层来确保平衡。
  • 插入和删除操作同样会自动调整树的结构以维持平衡。

示例
假设有一个 B+Tree,其中每个节点最多有两个键和三个子节点。一个简单的 B+Tree 可能如下所示:

       [10, 20]
      /     |     \
  [5, 7]  [15, 18]  [25, 30]
  /  \    /  \    /  \
[1, 3] [6, 8] [14, 16] [28, 32]

叶子节点之间的链接:
[1, 3] -> [6, 8] -> [14, 16] -> [28, 32]
  • B-Tree

    • 每个节点可以存储数据记录。
    • 内部节点和叶子节点都可以包含键和指向数据的指针。
    • 适用于单点查询和范围查询,但范围查询效率不如 B+Tree。
  • B+Tree

    • 只有叶子节点存储数据记录。
    • 内部节点只包含键和指向子节点的指针。
    • 叶子节点之间通过指针链接,形成一个链表,适合范围查询。
    • 适用于大量数据的索引和范围查询,是许多数据库系统(如 MySQL)中默认使用的索引结构。

这两种树结构都是为了优化磁盘访问性能而设计的,但在不同的应用场景下有不同的优劣。B+Tree 特别适合数据库索引,因为它能够有效地支持范围查询和顺序扫描。

2. B-Tree 与 B+Tree 的主要区别

B-Tree 和 B+Tree 是两种广泛用于数据库和文件系统中的索引结构。尽管它们有一些相似之处,但它们在设计上有一些关键的区别,这些区别影响了它们在不同应用场景下的性能和适用性。以下是 B-Tree 与 B+Tree 的主要区别:

1. 数据存储位置

  • B-Tree

    • 在 B-Tree 中,数据记录可以存储在内部节点或叶子节点中。
    • 每个节点都包含键和指向子节点的指针,同时也可以包含实际的数据记录。
  • B+Tree

    • 在 B+Tree 中,所有的数据记录只存储在叶子节点中。
    • 内部节点只包含键和指向子节点的指针,不包含数据记录。

2. 叶子节点的链表结构

  • B-Tree

    • B-Tree 的叶子节点之间没有链接关系,每个叶子节点是独立的。
  • B+Tree

    • B+Tree 的叶子节点通过指针链接在一起,形成一个有序的链表。
    • 这种链表结构使得范围查询和顺序扫描更加高效。

3. 查询效率

  • 单点查询

    • 对于单点查询(查找特定键的记录),B-Tree 和 B+Tree 的效率相当,因为两者都需要从根节点开始逐层向下查找。
  • 范围查询

    • 对于范围查询(查找某个区间内的所有记录),B+Tree 更具优势。由于 B+Tree 的叶子节点是通过指针链接在一起的,因此可以快速遍历整个区间。
    • B-Tree 的范围查询则需要多次回溯到父节点,然后再访问下一个子节点,这会导致更多的磁盘 I/O 操作。

4. 插入和删除操作

  • 插入操作

    • 在 B-Tree 中,插入操作可能会影响多个节点,包括内部节点和叶子节点。
    • 在 B+Tree 中,插入操作通常只影响叶子节点,因为数据记录只存储在叶子节点中。
  • 删除操作

    • 在 B-Tree 中,删除操作可能需要调整多个节点,包括内部节点和叶子节点。
    • 在 B+Tree 中,删除操作通常只影响叶子节点,但可能需要进行合并或重新平衡以保持树的性质。

5. 磁盘 I/O 效率

  • B-Tree

    • 由于 B-Tree 的内部节点也可能包含数据记录,所以在某些情况下,可能会导致更多的磁盘 I/O 操作。
    • 如果频繁进行范围查询,B-Tree 的效率较低,因为需要多次访问不同的节点。
  • B+Tree

    • B+Tree 通过将数据记录集中在叶子节点,并通过链表结构连接叶子节点,减少了范围查询时的磁盘 I/O 操作。
    • 适合大量数据的索引和范围查询,因为一次磁盘读取可以获取更多的数据记录。

结论

  • B-Tree

    • 适用于单点查询和较小规模的数据集。
    • 内部节点和叶子节点都可以存储数据记录。
    • 范围查询效率较低,因为需要多次访问不同的节点。
  • B+Tree

    • 适用于大量数据的索引和范围查询。
    • 所有数据记录都存储在叶子节点中,内部节点只包含键和指针。
    • 叶子节点通过链表连接,使得范围查询和顺序扫
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

激流丶

感觉小弟写的不错,给点鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值