B+树是如何进行查询的?

news/2025/4/3 0:02:34/文章来源:https://www.cnblogs.com/tsukinor/p/18804699

千里之行,始于足下。
—— 老子

因为一个数据页中的记录是有限的,且主键值是有序的,所以通过对所有记录进行分组,然后将组号(槽号)存储到页目录,使其起到索引作用,通过二分查找的方法快速检索到记录在哪个分组,来降低检索的时间复杂度。

但是,当我们需要存储大量的记录时,就需要多个数据页,这时我们就需要考虑如何建立合适的索引,才能方便定位记录所在的页。

为了解决这个问题,InnoDB采用了B+树作为索引。磁盘的I/O操作次数对索引的使用效率至关重要,因此在构造索引的时候,我们更倾向于采用“矮胖”的B+树数据结构,这样所需要进行的磁盘I/O次数更少,而且B+树更适合进行关键字的范围查询。

InnoDB里的B+树中的每个节点都是一个数据页,结构示意图如下:

通过上图,我们看出B+树的特点:

  • 只有叶子节点(最底层的节点)才存放了数据,非叶子节点(其它上层节)仅用来存放目录项作为索引;
  • 非叶子节点分为不同层次,通过分层来降低每一层的搜索量;
  • 所有节点按照索引键大小排序,构成一个双向链表,便于范围查询;

我们再看看B+树如何实现快速查找主键为6的记录,以上图为例子:

  • 从根节点开始,通过二分法快速定位到符合页内范围包含查询值的页,因为查询的主键值为6,在[1,7)范围之间,所以到页30中查找更详细的目录项;
  • 在非叶子节点(页30)中,继续通过二分法快速定位到符合页内范围包含查询值的页,主键值大于5,所以就到叶子节点(页16)查找记录;
  • 接着,在叶子节点(页16)中,通过槽查找记录时,使用二分法快速定位要查询的记录在哪个槽(哪个记录分组),定位到槽后,再遍历槽内的所有记录,找到主键为6的记录。

可以看到,在定位记录所在哪一个页时,也是通过二分法快速定位到包含该记录的页。定位到该页后,又会在该页进行二分法快速定位记录所在的分组(槽号),最后在分组内进行遍历查找。

原文

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

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

相关文章

使用RAGFlow和Docker部署本地知识库

随着DeepSeek的火热,大模型对与广大开发者越来越触手可及。本文介绍了使用 DeepSeek R1 模型来构建本地知识库。Ollama 管理本地模型首先要了解大模型的管理工具 Ollama:安装 OllamaOllama 官网   点击下载安装 Ollama 客户端;安装成功后打开,在终端中输入以下命令来检查是…

CherryStudio使用

一、概述 CherryStudio 是一款集多模型对话、知识库管理、AI 绘画、翻译等功能于一体的全能 AI 助手平台。 CherryStudio 高度自定义的设计、强大的扩展能力和友好的用户体验,使其成为专业用户和 AI 爱好者的理想选择。无论是零基础用户还是开发者,都能在 CherryStudio 中找到…

app测试——adb基本命令

ADB常用的指令:查看当前连接设备 : adb devices进入到shell : adb shell查看日志 : adb logcat ctrl+c退出安装apk文件 : adb install xxx.apk 安装安卓版本后缀apkk包测试包路径:E:\dcs\two\app\baiduyuedu_5520.apk卸载APP : adb uninstall +包名案例:adb uninstall…

移动端动态化建设的演进与实践:从技术革新到生态繁荣

移动端动态化建设已从技术优化演变为企业战略的核心组成部分。尤其在业务迭代加速、生态竞争加剧的背景下,小程序容器技术以其高效、灵活、合规的特性,成为动态化演进的重要方向。未来,随着5G、AI等技术的普及,动态化将进一步推动应用开发范式的变革,为智能终端生态的繁荣…

快节奏业务增长,还是得App混合开发

在用户需求瞬息万变、全球化竞争加剧的背景下,混合开发已从“成本妥协方案”进化为“战略效率工具”。通过跨端框架与小程序的生态协同,企业不仅能实现业务的快速迭代与全球扩张,更能在技术降本与用户体验间找到最佳平衡点。正如某金融科技公司CEO所言:“混合开发不是选择题…

Actor移动

移动玩家需要先修改控制器,再把控制器的数据给到组件旋转非玩家:set actor world rotation 面朝玩家:find look at rotation + rinterp to玩家:首先修改控制器 get control rotation -> set world rotation移动玩家起手式:获取玩家控制器 add input vector向前:get co…

操作系统纷纷闭源,技术创新如何“弯道超车”?

在操作系统闭源化与多平台流量分散的双重挑战下,小程序容器技术凭借其轻量化、跨平台和容器化技术优势,成为企业降本增效的核心解决方案。未来,随着AI技术的深度赋能与行业协作的加强,小程序有望进一步打破系统边界,推动全球应用生态向开放、智能、高效的方向演进。近年来…

GSoC谷歌编程之夏2025招募中,Apache DolphinScheduler需要你的提案!

GSoC谷歌编程之夏活动火热进行中!今年,Apache DolphinScheduler项目也依然参与其中,设立了有趣且有挑战性的项目任务,与通用OIDC认证有关。欢迎有才华的你们来挑战! GSoC的起源与目的 GSoC 即 Google Summer of Code(谷歌编程之夏),是谷歌公司发起的一项全球性活动,旨…

D365 邮箱发送,自动追加 CRM:0000001的问题处理

需要改下这个配置,去掉邮件标题 后面带的 CRM:0000001 记得收藏并关注,掌握更多相关知识!!!

4.1 函数

1.1 定义域 A,记作dom f=A; 值域记作:ran f1.2 函数的特点 A到B的函数是从A到B的二元函数的子集,且A中的每一个元素a都必须是f的有序对(a,b)的第一分量,通常把(x,y)∈f,记作f(x)=y,f把x映射成了y *定义域必须在第一分量里都出现 函数个数:nm,不同关系的个数2mn1.3 常…

一句话胜千言系列:BatchNorm和LayerNorm

1. 前言 一方面便于日后自己的温故学习,另一方面也便于大家的学习和交流。 如有不对之处,欢迎评论区指出错误,你我共同进步学习! 2. 正文 区别就一句话:BatchNorm是对一个batch-size样本内的每个特征[分别]做归一化,LayerNorm是[分别]对每个样本的所有特征做归一化。3. 后…