数据结构 —— B+树和B*树及MySQL底层引擎

数据结构 —— B+树和B*树及MySQL底层引擎

  • B+树
  • B*树
  • B树的应用
  • B树在MySQL中的应用
    • MyISAM
    • InnoDB

我们之前学习了B树的基本原理,今天我们来看看B树的一些改良版本——B+树和B*树。如果还没有了解过的小伙伴可以点击这里:

https://blog.csdn.net/qq_67693066/article/details/140588973

我们首先来看看B+树:

B+树

B+树是B树的变形,是在B树基础上优化的多路平衡搜索树,B+树的规则跟B树基本类似,但是又在B树的基础上做了以下几点改进优化:

  1. 分支节点的子树指针与关键字个数相同
  2. 分支节点的子树指针p[i]指向关键字值大小在[k[i],k[i+1])区间之间
  3. 所有叶子节点增加一个链接指针链接在一起
  4. 所有关键字及其映射数据都在叶子节点出现

大致是长成这个样子的:
在这里插入图片描述简单点来说,就是取消了最左边的树,让孩子等于关键字的个数,同时,所有的数据存放在叶子结点,非叶子结点只存放最小元素的地址,可以通过该地址寻找这个元素

下面是一些特点,可以结合上面的图参考:

B+树是一种专为数据库和文件系统设计的自平衡树数据结构,它具有以下几个关键特点:

  1. 所有数据都在叶节点:在B+树中,所有的数据记录都存储在最底层的叶节点上。内部(非叶)节点只包含索引项,每个索引项由键值和指向子节点的指针组成,而不包含数据本身。这允许内部节点存储更多的索引项,从而降低树的高度,提高查找效率。
  2. 叶节点相互连接:B+树的叶节点通过指针互相链接,形成一个链表。这种结构使得按顺序访问数据非常高效,有利于范围查询和数据排序。
  3. 自平衡:B+树在插入和删除操作时会自动重新平衡,以确保所有路径从根到叶节点的长度相同。这样可以保持树的高度较低,减少搜索深度,提高查询效率。
  4. 高度限制:B+树的高度通常很小,即使在处理大量数据时也是如此。这是因为每个节点可以存储多个键值和指针,这使得树的分支因子较大,从而降低了树的整体高度。
  5. 最小填充因子:为了保持树的平衡性和紧凑性,B+树中的节点必须至少达到某个最小填充因子,即每个节点至少应该有一半的空间被使用。当节点的键值数量低于这个阈值时,可能会发生合并或重新分配键值。
  6. 优化磁盘I/O:B+树被设计用于外部存储环境,如硬盘驱动器,其中磁盘访问时间远大于内存访问时间。通过将数据组织成块(节点),并且每个块尽可能多地包含数据和索引信息,B+树减少了磁盘I/O操作的次数,从而提高了性能。
  7. 插入和删除操作:B+树的插入和删除操作可能涉及节点的分裂和合并。当一个节点的键值数量超过其最大容量时,该节点会被分裂成两个节点;相反,如果一个节点的键值数量低于其最小填充因子,它可能会与兄弟节点合并或重新分配键值。
  8. 高效的范围查询:由于叶节点之间的链接,B+树可以高效地执行范围查询。只需找到范围的起始点,然后沿着叶节点链表遍历直到达到范围的终点。

这些特点使B+树成为数据库索引和其他需要高效数据检索和更新的系统中的理想选择。

B*树

B树是B+树的变形,在B+树的非根和非叶子节点再增加指向兄弟节点的指针。
在这里插入图片描述
下面是B
树的一些特点:

  1. 更高的填充因子:在B*树中,每个节点的最小键值数量被设定得更高,通常是节点最大容量的一半以上。这使得树的节点更加饱满,减少了树的高度和节点分裂的次数。
  2. 预分配溢出:当节点的键值数量达到一定阈值(例如最大容量的三分之二)时,B*树会将新插入的键值放入该节点,但同时也会将一部分键值移动到相邻的兄弟节点,如果有的话。这种机制被称为预分配溢出,它帮助保持树的平衡,防止节点过早分裂。
  3. 合并和再分配:如果一个节点的键值数量低于最低阈值,B*树会尝试从相邻的兄弟节点中借用键值,或者与兄弟节点合并。这种再分配和合并的策略有助于保持树的结构更加紧密和均衡。
  4. 减少分裂:由于预分配溢出和更高的填充因子,B*树的节点分裂事件比普通B树要少,这减少了磁盘写操作,提高了整体性能。
  5. 自平衡:就像B树一样,B*树在插入和删除操作后会自动进行结构调整,以保持树的平衡,确保所有路径从根到叶节点的长度相同。

B* 树的这些特性使其在处理大量数据和频繁更新的场景下表现更好,特别是在需要优化磁盘I/O的环境中 ,如大型数据库和文件系统。然而,B*树的复杂度略高于B树,因为需要处理预分配溢出和再分配逻辑,但这通常可以通过减少磁盘写操作带来的性能提升来弥补。

总结一下三种树的特点:

B树有序数组+平衡多叉树
B+树有序数组链表+平衡多叉树
B*树一棵更丰满的,空间利用率更高的B+树

B树的应用

B树在计算机科学和数据管理领域有着广泛的应用,尤其是对于需要处理大量数据和频繁读写操作的系统。以下是B树及其变体(如B+树和B*树)的几个主要应用领域:

  1. 数据库索引
  • 数据库管理系统(DBMS)经常使用B树或其变体(如B+树)来构建索引,以加速数据的查找。B树的自平衡特性确保了所有数据访问具有相同的延迟时间,而B+树的叶节点链接则优化了范围查询和顺序访问。
  1. 文件系统
  • 文件系统如NTFS、EXT4、XFS等利用B树来管理磁盘上的文件和目录结构。B树的结构可以有效地处理文件系统中的元数据,如文件名、位置和权限信息。
  1. 主内存数据库
  • 即使在内存数据库中,B树也是组织数据和索引的常用方法之一。虽然磁盘I/O不再是瓶颈,但B树的自平衡性质仍然有助于确保数据的快速访问。
  1. 空间索引
  • 在地理信息系统(GIS)和地图服务中,R树(一种B树的扩展)用于空间数据的索引,如地理位置坐标,以实现高效的位置查询。
  1. 分布式数据库
  • 在分布式数据库系统中,B树可以帮助管理和分布跨多个节点的数据,确保数据的一致性和快速访问。
  1. 搜索树
  • B树可以用作一般的搜索树,用于实现字典、映射或其他需要快速查找、插入和删除操作的数据结构。
  1. 网络路由
  • 在某些网络路由协议中,B树可以用来存储和查找路由表信息,帮助确定数据包的最佳传输路径。
  1. 虚拟内存管理
  • 在操作系统中,B树可以用于虚拟内存管理,如页面表的组织,以加快虚拟地址到物理地址的转换。
  1. 缓存管理系统
  • 高级缓存管理系统可能使用B树来组织缓存项,以支持高效的数据查找和替换策略。

B树之所以如此流行,是因为它能够有效处理大量数据,同时保持良好的性能和数据完整性。在需要频繁读写操作的场景下,B树的自平衡和高效查找特性使其成为一个理想的选择。

我们主要介绍一下B树在MySQL中的应用:

B树在MySQL中的应用

B树在MySQL中的应用主要体现在索引上:

https://blog.csdn.net/qq_67693066/article/details/138614378

在这篇文章中,我们介绍过MySQL中的索引是一种数据结构,这个数据结构。没错!就是B树。

同时基于B树,在创建索引时,会有两种方式:MyISAM和InnoDB

我们分别来介绍一下:

MyISAM

MyISAM 是 MySQL 中的一个存储引擎,它在 MySQL 的早期版本中非常流行,尤其在那些读取密集型的应用程序中,如网站和数据仓库。MyISAM 引擎具有以下特点和功能:

  1. 不支持事务
  • MyISAM 不提供事务支持,这意味着它不支持回滚、事务隔离级别或行级锁定。所有的操作都是立即提交的,没有事务日志,这简化了操作但也意味着数据在出现故障时可能无法恢复。
  1. 表级锁定
  • MyISAM 使用表级锁定,这意味着当一个查询正在更新或写入表时,其他需要读取或写入同一表的操作会被阻塞,直到锁被释放。这在高并发的写入操作场景下可能会影响性能。
  1. 全文索引支持
  • MyISAM 支持全文索引,这在需要执行复杂的文本搜索时非常有用。全文索引可以加速基于关键词的搜索。
  1. 高速读取性能
  • MyISAM 优化了读取性能,尤其在大量读取操作的场景下。由于没有事务和行级锁定的开销,读取操作通常非常快。
  1. 压缩和修复
  • MyISAM 支持表压缩,可以显著减小存储空间需求。此外,如果表结构损坏,可以使用 REPAIR TABLE 命令修复。
  1. 空间效率
  • MyISAM 引擎将数据和索引分开存储,数据存储在一个 .MYD 文件中,索引存储在一个 .MYI 文件中。这种分离的存储方式在某些情况下可以提高效率。
  1. 不支持外键
  • MyISAM 不支持外键约束,这意味着你不能使用它来强制引用完整性。
  1. 缓存机制
  • MyISAM 使用操作系统缓存,而不是像 InnoDB 那样有自己的缓冲池。这在某些系统配置下可能影响性能。
  1. 历史和兼容性
  • MyISAM 曾经是 MySQL 的默认存储引擎,在 MySQL 5.0 之前的版本中尤为常见。然而,由于 InnoDB 的事务支持和并发性能优势,MyISAM 在较新的应用中逐渐被取代。

MyISAM的B树的叶子结点存放的是数据的地址这是一个和InnoDB最本质的区别:

在这里插入图片描述
上图是以以Col1为主键,MyISAM的示意图,可以看出MyISAM的索引文件仅仅保存数据记录的地址。在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。如果想在Col2上建立一个辅助索引,则此索引的结构如下图所示:

在这里插入图片描述

InnoDB

InnoDB 是 MySQL 数据库中最常用的存储引擎之一,尤其在需要事务处理、并发控制和数据完整性保障的应用场景中。InnoDB 被设计为一个事务安全的存储引擎,提供了高级的数据库功能,以下是 InnoDB 的一些关键特性和功能:

  1. 事务支持
  • InnoDB 支持 ACID(原子性、一致性、隔离性、持久性)事务特性,确保数据操作的完整性和一致性。这意味着在事务中的一系列操作要么全部成功,要么全部失败。
  1. 行级锁定
  • InnoDB 使用行级锁定机制,这允许并发读写操作,而不会像 MyISAM 那样导致整个表被锁定。行级锁定极大地提高了高并发环境下的性能。
  1. 外键支持
  • InnoDB 支持外键约束,可以用来维护表之间的关系,确保引用完整性。
  1. 崩溃恢复
  • InnoDB 包含崩溃恢复机制,可以自动恢复因硬件故障、系统崩溃或停电等情况导致的未完成事务,保证数据的持久性。
  1. 缓冲池
  • InnoDB 使用缓冲池(Buffer Pool)来缓存数据和索引,减少磁盘 I/O 操作,从而提高读写性能。
  1. 自适应哈希索引
  • 如果某个索引被频繁访问,InnoDB 会自动在缓冲池中创建一个哈希索引,以加速查询速度。
  1. 在线操作
  • InnoDB 支持在线表重命名、在线表空间重命名和在线索引操作,这意味着可以在不影响应用程序的情况下进行数据库维护。
  1. 插入缓冲
  • 插入缓冲技术可以提高插入性能,尤其是在批量插入操作中,通过减少磁盘写入操作。
  1. 支持多种索引类型
  • InnoDB 支持多种索引类型,包括 B-Tree 索引、全文索引、空间索引等。
  1. 数据压缩
  • InnoDB 支持行级数据压缩,可以节省存储空间,减少 I/O 操作。
  1. 聚簇索引
  • InnoDB 使用聚簇索引存储数据,主键索引是聚簇索引,数据行按主键顺序物理存储,这有助于加速主键查找和范围查询。
  1. 多版本并发控制(MVCC)
  • InnoDB 实现了 MVCC,允许读取操作不会阻塞写入操作,从而提高并发性能。

由于这些特性,InnoDB 成为了现代数据库应用的首选存储引擎,尤其是在需要高并发、数据一致性和事务安全的场景下。自 MySQL 5.5 版本开始,InnoDB 已经成为了 MySQL 的默认存储引擎。

InnoDB的B树创建索引时,叶子结点存储的就是文件,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址
在这里插入图片描述上图是InnoDB主索引(同时也是数据文件)的示意图,可以看到叶节点包含了完整的数据记录,这种索引叫做聚集索引因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整型。

第二个区别是,第二个区别是InnoDB的辅助索引data域存储相应记录主键的值而不是地址,所有辅助索引都引用主键作为data域。
在这里插入图片描述

这就是会导致一个问题标准不一样,形成的B树可能会不一样所以InnoDB创建索引一定要你指定主键,这是因为如果你之后还有其他的寻找标准,会以当前标准在对应的B树中寻找,然后又会回到主键创建的B树中寻找,会找两次

比如说:

CREATE TABLE students (student_id INT AUTO_INCREMENT,name VARCHAR(255) NOT NULL,PRIMARY KEY (student_id), //会以student_id主键创建一棵B树INDEX idx_name (name) //会以name创建一棵B树
) ENGINE=InnoDB;

聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录

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

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

相关文章

【MySQL进阶之路 | 高级篇】MVCC三剑客:隐藏字段,Undo Log,ReadView

1. 再谈隔离级别 我们知道事务有四个隔离级别,可能存在三种并发问题: 在MySQL中,默认的隔离级别是可重复读,可以解决脏读和不可重复读的问题,如果仅从定义的角度来看,它并不能解决幻读问题。如果我们想要解…

Nacos-2.4.0最新版本docker镜像,本人亲自制作,部署十分方便,兼容postgresql最新版本17和16,奉献给大家了

基于Postgresql数据库存储的nacos最新版本2.4.0,采用docker镜像安装方式 因业务需要,为了让nacos支持postgresql,特意花了两天时间修改了源码,然后制作了docker镜像,如果你也在找支持postgresql的nacos最新版本,恭喜你,你来的正好~ nacos-2.4.0 postgresql的数据库脚本…

安宝特方案|解放双手,解决死角,AR带来质量监督新体验

AR质量监督 解放双手,解决死角 在当今制造业快速发展的背景下,质量监督成为确保产品高质量和完善的管理制度的关键环节。然而,传统的质量监督方式存在诸多挑战,如人工操作带来的效率低下、查岗不及时、摄像头死角等问题。 为了解…

本地部署,Whisper: 开源语音识别模型

目录 简介 特点 应用 使用方法 总结 GitHub - openai/whisper: Robust Speech Recognition via Large-Scale Weak SupervisionRobust Speech Recognition via Large-Scale Weak Supervision - openai/whisperhttps://github.com/openai/whisper 简介 Whisper 是一个由 O…

GoogleCTF2023 Writeup

GoogleCTF2023 Writeup Misc NPC Crypto LEAST COMMON GENOMINATOR? Web UNDER-CONSTRUCTION NPC A friend handed me this map and told me that it will lead me to the flag. It is confusing me and I don’t know how to read it, can you help me out? Attach…

软件更新的双刃剑:从”微软蓝屏”事件看网络安全的挑战与对策

引言 原文链接 近日,一场由微软视窗系统软件更新引发的全球性"微软蓝屏"事件震惊了整个科技界。这次事件源于美国电脑安全技术公司"众击"提供的一个带有"缺陷"的软件更新,如同一颗隐形炸弹在全球范围内引爆,…

17.5【C语言】static的补充说明

static &#xff08;静态的) 作用&#xff1a;修饰局部变量&#xff0c;修饰全局变量&#xff0c;修饰函数 对比两段代码 #include <stdio.h> void test() {int a 5;a;printf("%d ", a); } int main() {int i 0;for(i0; i<5; i){test();}return 0; } …

高并发内存池——链表设计

自由链表类的设计 由于申请的空间块经过对齐之后大小至少为8&#xff0c;因此可以考虑在未被使用的内存块中取前8字节存储下一个空间的地址 FreeList类初步声明 class FreeList { private:void* _freelistnullptr; //自由链表头指针size_t _size0; //自由链表的长度size_t …

【Django】anaconda环境变量配置及配置python虚拟环境

文章目录 配置环境变量配置python虚拟环境查看conda源并配置国内源在虚拟环境中安装django 配置环境变量 control sysdm.cpl,,3笔者anaconda安装目录为C:\ProgramData\anaconda3 那么需要加入path中的有如下三个 C:\ProgramData\anaconda3 C:\ProgramData\anaconda3\Scripts C:…

最新风车IM即时聊天源码及完整视频教程2024年7月版

堡塔面板 试验性Centos/Ubuntu/Debian安装命令 独立运行环境&#xff08;py3.7&#xff09; 可能存在少量兼容性问题 不断优化中 curl -sSO http://io.bt.sy/install/install_panel.sh && bash install_panel.sh 1.宝塔环境如下: Nginx 1.20 Tomcat 8 MySQL 8.0 R…

Java 开发环境配置

1. 下载 JDK 直接在oracle 官网下载 https://www.oracle.com/java/technologies/downloads或者使用博主已经从oracle下载的 jdk21&#xff1a;https://download.csdn.net/download/u011171506/89585231jdk8&#xff1a;https://download.csdn.net/download/u011171506/8958523…

快醒醒,别睡了!...讲《数据分析pandas库》了—/—<4>

一、废话不多说&#xff0c;直接开讲 1、DataFrame的索引和切片 1.1 选择列 当想要获取 df 中某列数据时&#xff0c;只需要在 df 后面的方括号中指明要选择的列即可。如果是 一列&#xff0c;则只需要传入一个列名;如果是同时选择多列&#xff0c;则传入多个列名即可&#xf…

SAPUI5基础知识20 - 对话框和碎片(Dialogs and Fragments)

1. 背景 在 SAPUI5 中&#xff0c;Fragments 是一种轻量级的 UI 组件&#xff0c;类似于视图&#xff08;Views&#xff09;&#xff0c;但它们没有自己的控制器&#xff08;Controller&#xff09;。Fragments 通常用于定义可以在多个视图中重用的 UI 片段&#xff0c;从而提…

集成千兆网口(Gigabit Ethernet Port)的作用主要是提供高速的有线网络连接,其工作原理涉及以下几个关键点:

传输速率&#xff1a; 千兆网口支持的最高传输速率达到1 Gbps&#xff08;即每秒10亿位&#xff09;&#xff0c;是传统百兆网口&#xff08;100 Mbps&#xff09;的十倍速度。这使得它能够处理更大量、更高质量的数据传输。 数据传输效率&#xff1a; 千兆网口能显著提高局域…

C#如何引用dll动态链接库文件的注释

1、dll动态库文件项目生成属性中要勾选“XML文档文件” 注意&#xff1a;XML文件的名字切勿修改。 2、添加引用时XML文件要与DLL文件在同一个目录下。 3、如果要是添加引用的时候XML不在相同目录下&#xff0c;之后又将XML文件复制到相同的目录下&#xff0c;需要删除引用&am…

【机器学习】Python、NumPy和向量化的基础知识以及三者结合的用法和示例

引言 在机器学习中&#xff0c;NumPy是一个非常重要的库&#xff0c;特别是在进行向量化操作时。向量化是一种优化技术&#xff0c;可以显著提高数组计算的效率&#xff0c;特别是在处理大型数据集时。NumPy提供了丰富的数组运算功能&#xff0c;使得向量化操作变得简单高效 文…

驾驭代码的无形疆界:动态内存管理揭秘

目录 1.:为什么要有动态内存分配 2.malloc和free 2.1:malloc 2.2:free 3.calloc和realloc 3.1:calloc 3.1.1:代码1(malloc) 3.1.2:代码2(calloc) 3.2:realloc 3.2.1:原地扩容 3.2.2:异地扩容 3.2.3:代码1(原地扩容) 3.2.3:代码2(异地扩容) 4:常见的动态内存的错误…

掀桌子了!原来是咱们的大屏设计太酷,吓着前端开发老铁了

掀桌子了&#xff01;原来是咱们的大屏设计太酷&#xff0c;吓着前端开发老铁了 艾斯视觉观点认为&#xff1a;在软件开发的世界里&#xff0c;有时候创意和设计的火花会擦得特别亮&#xff0c;以至于让技术实现的伙伴们感到既兴奋又紧张。这不&#xff0c;我们的设计团队刚刚…

Vue的安装配置

1.安装node js Node.js — 在任何地方运行 JavaScript (nodejs.org) 2.测试nodejs是否安装成功 node -v npm -v3.通过npm 安装 vue npm install -g vue/cli4.测试vue是否安装成功 vue --version5.打开PyCharm&#xff0c;创建项目&#xff1a;flask-web vue create flask…

【H.264】H.264详解(二)—— H264视频码流解析示例源码

文章目录 一、前言二、示例源码【1】目录结构【2】Makefile源码【3】h264parser.c源码【4】编译运行【5】源码下载地址 声明&#xff1a;此篇示例源码非原创&#xff0c;原作者雷霄骅。雷霄骅&#xff0c;中国传媒大学通信与信息系统专业博士生&#xff0c;在此向雷霄骅雷神致敬…