B树和B+树

article/2025/6/30 6:27:34

二叉搜索树和平衡二叉树

        二叉搜索树,左子节点小于父节点发值,右子节点大于父节点的值。如果需要查找8,需要三次,而顺序查找需要6次。

        同样是二叉搜索树,下图的情况查找效率会很低,从而引出平衡二叉树(AVL树),平衡二叉树要求任何节点的子树高度最大差为1。平衡性确保查找的速度可以很快,避免了二叉搜索树的极端情况。

B树和B+树

        平衡二叉树随着节点的增加,树的高度会越来越高,会增加磁盘的I/O次数,影响查询效率,从而引出了B树,B树不限制一个节点只能由2个子节点,从而降低树的高度。

        B树可以将节点的大小优化为磁盘块的大小,每次读取可以有效加载多个节点,B树常用于数据库库等需要高效访问磁盘的场景。

        B+树是对B树的升级,B+树只有叶子节点存数据,非叶子节点只存索引。叶子节点包含所有索引,叶子节点构成一个有序链表,范围查找更快。由于非叶子节点只存索引,B+树比B树的非叶子节点可以存更多索引,高度更低,磁盘I/O次数更少

B+树结构图

B树与B+树差异:

  • 叶子节点(最底部的节点)才会实际存放数据(索引+记录),非叶子节点只会存放索引;
  • 所有索引都会在叶子节点出现,叶子节点之间构成一个有序链表;
  • 非叶子节点的索引也会同时存在子节点中,并且是在子节点中所有索引的最大(或最小)。
  • 非叶子节点中有多少个子节点,就有多少索引;

性能区别

1.单点查询

B 树查询

  • 最快查询时间:B 树进行单个索引查询时,若要查找的索引恰好在非叶子节点,无需再向下遍历,能在 O(1) 时间代价内查到,这是它最快的情况。但平均来看,由于节点既存索引又存记录,查询时可能要访问到叶子节点才能找到索引,不确定性较大,所以查询波动大
  • 平均时间:理论上平均时间比 B + 树稍快些,不过实际中因为其查询的不确定性,在大规模数据和频繁查询场景下,优势可能不明显。

B + 树查询

  • 结构优势:B + 树非叶子节点仅存放索引,不存实际记录数据。相同数据量下,相比 B 树,B + 树的非叶子节点能存放更多索引,树的层级会更少,变得更 “矮胖” 。
  • I/O 次数:数据库中查询涉及磁盘 I/O 操作,B + 树层级少,查询底层节点(叶子节点获取数据)时所需的磁盘 I/O 次数就会更少,在实际应用尤其是磁盘 I/O 开销较大的场景下,整体查询效率更稳定,性能表现往往更好。

2、插入和删除效率

  • B + 树:有冗余节点 。删除节点常可直接从叶子节点删,不怎么动非叶子节点;删除根节点也不易致树复杂变形。插入时节点饱和会分裂,但最多影响一条路径,还能自动平衡,不搞复杂旋转,插入删除都高效。
  • B 树:无冗余节点 。删除节点(尤其根节点)会让树复杂变形,要各种调整;插入推测也因需维持结构平衡,比 B + 树麻烦,插入删除效率低。

3.范围查询

  • B 树:范围查询时,由于没有叶子节点链表结构,只能从根节点开始逐层遍历整棵树,递归进入子节点判断数据是否在范围内。比如查询成绩在 80 - 90 分之间的学生信息,需多次从根节点出发,在不同层级节点间查找判断,多次磁盘 I/O 操作,效率较低。适用于单个索引查询场景。
  • B + 树:叶子节点由链表串联。进行范围查询时,先找到范围起始值对应的叶子节点,像查询 10 - 20 号订单,定位到 10 号订单所在叶子节点后,可顺着链表顺序找到 20 号订单节点,无需反复回溯根节点,减少磁盘 I/O,范围查询效率高,常用于数据库等大量范围检索场景。

在MySQL中B+树

MySQL中的存储方式是按存储引擎不同而不同的,最常用的就是InnoDB存储引擎,它采用的B+树作为索引的数据结构。

InnoDB中的B+树结构

1.叶子节点连接方式

  • 特点:叶子节点通过双向链表连接 。
  • 优势:具备双向遍历能力,在范围查询时,既可以从起始点向右遍历获取大于起始值的数据,也能向左遍历获取小于起始值的数据 。例如在查询某时间段前后的订单记录时,双向链表能灵活满足不同方向的范围检索需求,提高查询效率。

2.节点内容与数据页

  • 特点:B + 树节点即数据页,存放用户记录及相关信息,默认大小为 16KB 。
  • 作用:数据页这种存储结构能将相关数据集中存放,减少磁盘 I/O 次数。比如在查询用户表中某部分用户记录时,若这些记录在同一数据页,一次 I/O 操作就能读取到,提升数据读取效率 。同时,固定的 16KB 大小便于 InnoDB 进行页管理和内存分配等操作 。

此外B+树索引分为聚簇索引(主键索引)和非聚簇索引(二级索引)。


http://www.hkcw.cn/article/EuUCyFYjay.shtml

相关文章

PDF 转 HTML5 —— HTML5 填充图形不支持 Even-Odd 奇偶规则?(第一部分)

在填充 PDF 中的图形时(以及许多其他技术中),你可以选择使用 Even-Odd(奇偶) 或 Non-Zero(非零) 填充规则。 对于那些已经在想“你在说啥?”的朋友,别担心,我…

java反序列化: Transformer链技术剖析

Transformer链是CC反序列化漏洞的"执行引擎",本文聚焦Transformer链的核心原理和实现机制,为后续完整利用链分析奠定基础。 一、Java命令执行与序列化限制 1.1 常规命令执行方式 Java中执行系统命令的标准方法是通过Runtime类: …

bismark OT CTOT OB CTOB 以及mapping后的bam文件中的XG,XR列的含义

首先,OT,OB,CTOT,CTOB都是描述测序reads的,而不是描述参考基因组的。 bisul-fate建库会将DNA双链文库中非甲基化的C转化成U。转化结束后,被转化的U和互补链的G并不配对。此时正链(,…

【笔记】部署 AgenticSeek 项目问题:端口 8000 被占用

🚫 部署 AgenticSeek 项目问题二:端口 8000 被占用 💡 问题描述 运行 api.py 时,控制台报错: ERROR: [Errno 10048] error while attempting to bind on address (0.0.0.0, 8000): 通常每个套接字地址(协议/网络地址…

javaEE->IO:

文件: 操作系统中会把很多 硬件设备 和 软件资源 抽象成“文件”,统一进行管理。 大部分谈到的文件,都是指 硬盘的文件,文件就相当于是针对“硬盘”数据的一种抽象 硬盘: 1.机械硬盘:便宜 2.固态硬盘&…

Python窗体编程技术详解

文章目录 1. Tkinter简介示例代码优势劣势 2. PyQt/PySide简介示例代码(PyQt5)优势劣势 3. wxPython简介示例代码优势劣势 4. Kivy简介示例代码优势劣势 5. PySimpleGUI简介示例代码优势劣势 技术对比总结选择建议 Python提供了多种实现图形用户界面(GUI)编程的技术&#xff0c…

短视频平台差异视角下开源AI智能名片链动2+1模式S2B2C商城小程序的适配性研究——以抖音与快手为例

摘要 本文以抖音与快手两大短视频平台为研究对象,从用户群体、内容生态、推荐逻辑三维度分析其差异化特征,并探讨开源AI智能名片链动21模式与S2B2C商城小程序在平台适配中的创新价值。研究发现,抖音的流量中心化机制与优质内容导向适合品牌化…

线程间和进程间是如何进行通信

进程是由线程组成的,进程所拥有的功能线程全部具有,线程所拥有的功能进程不一定有,所有线程的通信方式,进程不一定有。 线程之间的通信主要有两种:共享内存和信息传递 (端口,方法调用等等) 进程之间的通…

wow Warlock shushia [Dreadsteed]

wow Warlock shushia [Dreadsteed] 克索诺斯恐惧战马坐骑的任务 在《魔兽世界》怀旧服中,术士大马任务,也就是获得克索诺斯恐惧战马坐骑的任务,是一个既充满挑战又极具成就感的系列任务。以下是详细的任务流程: 一、任务起始 ‌…

Axure 基础入门

目录 认识产品经理 项目团队* 基本概述 认识产品经理 A公司产品经理 B公司产品经理 C公司产品经理 D公司产品经理 产品经理工作范围 产品经理工作流程* 产品经理的职责 产品经理的分类 产品经理能力要求 产品工具 产品体验报告 原型设计介绍 原型设计概述 为…

快手可灵视频V1.6模型API如何接入免费AI开源项目工具

全球领先的视频生成大模型:可灵是首个效果对标 Sora 、面向用户开放的视频生成大模型,目前在国内及国际上均处于领先地位。快手视频生成大模型“可灵”(Kling),是全球首个真正用户可用的视频生成大模型,自面…

哈工大2024春csapp大作业——程序人生-Hello’s P2P

计算机系统 大作业 题 目 程序人生-Hello’s P2P 专 业 网络空间安全 学   号 2022110717 班   级 2203901 学 生 胡丁鹏     指 导 教 师 史先俊    计算机科学与…

程序人生的学习密码:终身学习促进职业生涯飞跃

程序人生的学习密码:终身学习促进职业生涯飞跃 关键词:终身学习、程序员成长、知识体系构建、学习方法论、技术迭代、职业发展、认知升级 摘要:在技术快速迭代的IT领域,程序员的职业生涯能否实现持续飞跃,核心在于是否构建了高效的终身学习体系。本文从认知科学和职业发展…

软件测试找工作|20道银行项目高频面试题

小编给大家上面试干货啦!把前两天整理的银行项目面试题系列汇总给你们复习吼! 先来看下面试题的目录叭...... 1、介绍一下贷款的项目? 贷款项目是银行业务中的重要组成部分,它是指银行向客户提供资金,让客户在约定的期…

【老张的程序人生】我命由我不由天:我的计算机教师中级岗之旅

在计算机行业的洪流中,作为一名20年计算机专业毕业的博主,我深知这几年就业的坎坷与辉煌。今天,我想与大家分享我的故事,一段关于梦想、挑战与坚持的计算机教师中级岗之旅。希望我的经历能为大家提供一个发展方向,在计…

程序人生-Hello’s P2P(2025)

计算机系统 大作业 题 目 程序人生-Hello’s P2P 专 业 计算机与电子通信 学   号 2023111735 班 级 23L0509 学 生 杨祥锐 指 导 教 师 史先俊 …

程序人生-Hello‘s P2P

计算机系统 大作业 题 目 程序人生-Hello’s P2P 专 业 生命科学和医学学院 学   号 2023113108 班   级 2352001 学 生 杜若林 指 导 教 师 刘松波 计算机科学与技术…

2025哈工大计统PA-P2P程序人生

摘 要 作此论文的目的是为了了解程序从输入终端到在终端中显示运行的一系列过程。本文详细分析了计算机在生成hello可执行文件的预处理、编译、汇编、链接、进程管理等整个生命周期,解析了hello程序从初始状态输入到结束执行被回收的全部过程,查看并注…

程序人生Hello’s P2P CSAPP大作业

计算机系统 大作业 题 目 程序人生-Hello’s P2P 专 业 计算学部 学   号 2023112327 班   级 23L0509 学 生 朱永久      指 导 教 师 …

数据库系统概论(十五)详细讲解数据库视图

数据库系统概论(十五)数据库视图 前言一、什么是视图?二、视图的作用1. 保护数据安全2. 屏蔽表结构变化3. 简化复杂查询4. 多角度展示数据 三、如何创建视图?语法格式:5种常见视图类型: 四、更新视图的限制…