MySql B树 B+树

什么是叶子节点?

想象你有一本书,书中的每一页都是一个节点。在这本书里,有些页面包含的是目录或章节标题(这些可以类比为内部节点),而另一些页面则包含了实际的内容,比如故事、文章或者数据记录(这些是叶子节点)。叶子节点就是存储真实数据的最终位置,在树结构中它们位于最底层,没有子节点。

在B树中

内部节点:类似于书中的目录页,它们包含分隔值(例如字母A, C, M等)和指向子节点(下一页)的指针。当你查找数据时,根据你要找的数据范围来决定应该去哪个子节点。

叶子节点:这是存放实际数据的地方。在B树中,叶子节点也会存储一些数据,并且所有的叶子节点都处于同一层。

在B+树中

内部节点:与B树相似,它们只包含用于指引方向的分隔值和指向子节点的指针,但不存储任何用户数据。

叶子节点:所有的真实数据记录都存放在叶子节点上。此外,这些叶子节点之间通过指针相互链接,形成一个链表结构,这使得你可以从一个叶子节点快速移动到下一个叶子节点,非常适合范围查询。

具体例子

假设我们有一个按名字排序的电话簿:

B树的情况:

复制代码
内部节点 (A, D, G)
    / | \
   /  |  \
叶节点(Alice) 叶节点(David, Emily) 叶节点(George, Helen)

在这个例子中,如果你要找"Emily",你会先看根节点的分隔值,发现"Emily"落在D和G之间,于是你前往中间的那个叶子节点,然后在那里找到Emily的信息。

B+树的情况:
复制代码
内部节点 (A, D, G)
    / | \
   /  |  \
叶节点(Alice) -> 叶节点(David, Emily) -> 叶节点(George, Helen)

这里,所有的数据都在叶子节点上,而且叶子节点之间有额外的链接。如果你要找"Emily",过程与B树类似,但是如果你想要找出所有以"D"开头的名字,你可以从第一个匹配的叶子节点开始,沿着链表向右遍历,直到超出范围为止。

那我可不可以这样理解 就是 B树 的数据存放再叶子节点 B+树的数据也存在叶子节点 他们最大的区别就是B+树的叶子节点用指针连接起来了?

是可以这样理解 但是还需要做些补充:

数据存储位置

  • B树 和 B+树 的确都将数据存储在叶子节点中。但是,在标准的B树中,内部节点也可能包含一些数据(键值),而不仅仅是分隔值和指向子节点的指针。这意味着在B树中,你有可能在非叶子节点上找到部分数据。
  • B+树 则明确规定所有用户数据仅存放在叶子节点中,内部节点只用于指引方向,不存储用户数据。这使得B+树的每个内部节点可以容纳更多的分隔值,从而减少了树的高度,提高了查询效率。

叶子节点链接

  • B+树 的叶子节点之间确实通过指针相互链接,形成了一个双向链表结构。这一特性使得B+树非常适合范围查询,因为你可以从一个叶子节点开始,沿着链表快速访问相邻的叶子节点,直到找到所有符合条件的数据。
  • B树 的叶子节点通常不会相互链接,因此对于范围查询的支持不如B+树高效。每次进行范围查找时,可能需要重新从根节点开始遍历树结构,直到找到下一个匹配的叶子节点。

"B树的数据存放再叶子节点,B+树的数据也存在叶子节点,他们最大的区别就是B+树的叶子节点用指针连接起来了"------是正确的,,但还有一点细微差别在于B树的内部节点也可以存储数据,而B+树的所有用户数据都集中在叶子节点,并且这些叶子节点之间有额外的链接以支持高效的范围查询。

在MySQL的InnoDB存储引擎中,采用的是B+树结构,它不仅将所有数据存储在叶子节点中,而且叶子节点之间的链接使得范围查询更加高效。这种设计优化了磁盘I/O性能,特别适合于数据库应用中的大量读写操作。

在MySQL的InnoDB存储引擎中使用的是B+树结构

相关推荐
likangbinlxa41 分钟前
【Oracle11g SQL详解】UPDATE 和 DELETE 操作的正确使用
数据库·sql
r i c k1 小时前
数据库系统学习笔记
数据库·笔记·学习
野犬寒鸦1 小时前
从零起步学习JVM || 第一章:类加载器与双亲委派机制模型详解
java·jvm·数据库·后端·学习
IvorySQL2 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
·云扬·2 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
IT邦德2 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫3 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i3 小时前
完全卸载MariaDB
数据库·mariadb
纤纡.3 小时前
Linux中SQL 从基础到进阶:五大分类详解与表结构操作(ALTER/DROP)全攻略
linux·数据库·sql
jiunian_cn3 小时前
【Redis】渐进式遍历
数据库·redis·缓存