用一个「图书馆找书」的比喻来解释 B+ 树的核心原理

news/2025/3/26 18:09:26/文章来源:https://www.cnblogs.com/horacexie/p/18790345

B+ 树就像图书馆的智能目录系统

想象你走进一个巨大的图书馆,所有书都按「书号」排序存放在书架上(类似数据库按主键存储数据)。如果没有索引,找一本书得从头到尾遍历书架,效率极低。

而 B+ 树就像图书馆的‌智能目录系统‌,它的结构是这样的:


1. 分楼层导航(多叉树结构)

  • 一楼入口(根节点)
    这里有一块大屏幕,显示多个区间提示,比如:
    书号 1-100 → 去2楼 | 书号 101-200 → 去3楼 | 书号 201-300 → 去4楼
    这些提示不直接对应具体书籍,只告诉你去哪个楼层继续找。

  • 中间楼层(内部节点)
    比如你根据提示到了3楼,这里又有一个屏幕:
    书号 101-150 → A区 | 书号 151-200 → B区
    继续指引你细化范围。

  • 顶楼书架(叶子节点)
    最终到达顶楼,所有书籍按书号整整齐齐排列在书架上,并且书架之间有「箭头标识」连成一个链表。
    比如找到书号 177 的书后,你可以直接沿着链表找到下一本书 178,无需返回楼下重新导航。


2. B+ 树的核心特点

特点1:目录只负责导航,书都在顶楼(数据分离)

  • 根节点和中间节点‌:只存储导航用的「书号范围」(相当于索引键),不存储实际书籍。
  • 叶子节点‌:存储所有书籍(数据行)并按书号严格排序,通过链表快速跳转到相邻数据。

✅ 好处‌:
导航信息(非叶子节点)可以设计得非常紧凑,每个楼层能展示更多指引,减少上下楼次数(相当于减少磁盘IO)。


特点2:每层楼能展示大量指引(多叉树)

  • 传统二叉树(比如二叉搜索树)每层只有两个分叉,导航效率低。
  • B+ 树每层可以有几十甚至上百个分叉(比如一个节点存100个书号区间),就像图书馆每层楼有几十个指示牌。

✅ 好处‌:
树的高度非常低(比如100万数据只需3层),找书时只需上下楼3次(相当于3次磁盘IO)。


特点3:顶楼书架连成环形(叶子节点链表)

  • 所有叶子节点(书架)通过指针连成双向链表。
  • 找完书号 177 后,可以直接向左找 176,向右找 178,无需回到楼下重新开始。

✅ 好处‌:
范围查询(比如找书号 150-200)效率极高,沿着链表顺序扫描即可。


3. B+ 树为什么比B树更适合数据库?

  • B树的缺点‌:
    B树的每个节点既存导航键,又存实际数据。就像图书馆每层楼既放指引牌,又放几本书,导致楼层变多,找书更慢。

  • B+树的优化‌:
    把实际数据全部“赶到”顶楼,楼下只放导航信息,这样:

    1. 导航节点更轻量,单节点能存更多键,树更矮。
    2. 范围查询直接遍历顶楼链表,无需回溯。

4. B+ 树 vs B 树 vs 哈希表

特性 B 树 B+ 树 哈希表
数据存储位置 所有节点存键值+数据指针 仅叶子节点存数据指针,内部节点存键值 桶结构存储键值对
范围查询效率 需要遍历多层节点 叶子节点链表直接遍历,O(1) 跳转 仅支持等值查询
磁盘 I/O 优化 节点存储数据导致树更高 内部节点仅存键,单节点容纳更多键 无优化,随机访问
适用场景 内存数据库 磁盘型数据库(MySQL InnoDB) 缓存/等值查询

关键结论‌:
B+ 树的‌扁平化结构‌(更矮的树高)和‌有序叶子节点链表‌,使其在磁盘存储和范围查询场景具有绝对优势。


总结:B+ 树的优势

  1. 超矮的树‌:1000万数据只需3层,3次IO就能找到目标。
  2. 适合磁盘‌:每次IO读取一个节点(比如16KB),正好匹配磁盘块大小。
  3. 范围查询快‌:叶子节点链表直接遍历,无需回溯到根节点。

就像图书馆的智能导航系统,让你用最少的步数找到书,还能快速浏览相邻书籍!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/905024.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LLM大模型:post-train实战 - 使用GRPO微调LLM

deepseek带火了GRPO,更带火了reinforcement learning,让研究人员发现RL能在pre-train的基础上较大提升LLM的逻辑推理能力!当前,互联网高速发展二十多年产生的优质数据已经使用殆尽,所以更大规模的LLM一直难产(GPT-5现在都还没发布,优质token耗尽是核心原因之一)。市面上…

MQ 消息幂等性保证

MQ 消息幂等性保证 1. 什么是幂等性 在程序开发中,是指同一个业务,执行一次或多次对业务状态的影响是一致的。例如:根据 id 删除数据 查询数据在实际业务中,避免不了出现用户连续点击退款、重复点击删除等情况,这种情况下,就需要对多个消息进行处理,避免短时间内多次执行…

3.24 曲线/曲面积分

1 第一类曲线积分 (理解成求曲线的质量) 要把ds(弧微分)转化成dt(参数方程里面的自变量)(积分里面只留下的变量),也可以转化成dx什么的,注意ds转化成dx的公式 2 第一类曲面积分 还是先求投影,比如投影到xoy平面上,就求z=z(x,y) 2.1 普通对称性奇函数为0,偶函数*2 2.…

SmolVLM2: 让视频理解能力触手可及

一句话总结: SmolVLM 现已具备更强的视觉理解能力📺 SmolVLM2 标志着视频理解技术的根本性转变——从依赖海量计算资源的巨型模型,转向可在任何设备运行的轻量级模型。我们的目标很简单: 让视频理解技术从手机到服务器都能轻松部署。 我们同步发布三种规模的模型 (22 亿/5 亿…

React-Native开发鸿蒙NEXT-video

React-Native开发鸿蒙NEXT-video 前几周的开发,基本把一个”只读型“社区开发的差不多了。帖子列表,详情,搜索都迁移实现了,但还差了一点------视频类型帖子的展示。之前开发RN社区中,对于视频的处理用的是react-native-video,这个三方组件也已经实现了鸿蒙化,部分逻辑可…

React-Native开发鸿蒙NEXT-cookie设置

React-Native开发鸿蒙NEXT-cookie设置 应用有个积分商城,做一些积分兑换的业务,就一个基于react-native-webview开发的页面,在页面加载的时候通过js注入来设置cookie带入用户信息。 早先应甲方要求web网站关闭了,现在又要继续运行。于是就把web服务启动了,然后发现应用里积…

第六天

单词 以下是今天需学习的35个单词复习,同时前几天的单词阅读 理解文章大意,记录不认识的单词。今天这个阅读非常应当下的情景。 How to Teach Yourself Anything in Less than Three Months 如何在3个月内学习任何一件事(一) Self-education can be wonderful and frustrat…

React Native开发鸿蒙Next---富文本浏览

React Native开发鸿蒙Next---富文本浏览 最近在继续开发App剩余的社区功能。地铁的社区相对较为特殊,只有公告/政策规章/操作指南等资讯阅读功能,无法进行交互。对于原先的社区RN,除了移植适配鸿蒙,还需要做大量的功能屏蔽等改造。新的社区后台大量采用富文本进行内容编辑,…

17.指针

正如您所知道的,每一个变量都有一个内存位置,每一个内存位置都定义了可使用 & 运算符访问的地址,它表示了在内存中的一个地址。 请看下面的实例,它将输出定义的变量地址:#include <stdio.h>int main(){int var_runoob = 10;int *p; //定义指针变量p = &var…

3.24 学习记录

实现了学习记录APP的登录注册功能

2025西安交大集训Day2:DFS,BFS记忆化搜索,迭代加深搜索,二分搜索

2025西安交大集训Day2:DFS,BFS记忆化搜索,迭代加深搜索,二分搜索

掌握 Postman:高级 GET 请求技术与响应分析

欢迎阅读本指南,它将详细介绍如何在 Postman 中发送 GET 请求并理解 API 响应。对于希望提升 API 测试和开发能力的开发者来说,这是不可或缺的技能。 Postman 对开发者的重要性Postman 是 API 开发和测试中不可或缺的工具。它不仅简化了发送请求和分析响应的过程,还提供了一…