Mysql--技术文档--B+树-数据结构的认知

阿丹解读:

之前的文章中写道了有关mysql底层索引,那么在数据量特别大的情况下。mysql采用了B+来管理索引。和存储的数据。

Mysql--技术文档--索引-《索引为什么查找数据快?》-超底层详细说明索引_一单成的博客-CSDN博客

B树解读:

Mysql--技术文档--B树-数据结构的认知_一单成的博客-CSDN博客

基本概念-B+树/B树

B树(B-tree)和B+树(B+ tree)是常见的自平衡搜索树数据结构,用于在存储和检索大量数据时提供高效的操作。它们具有一些共同的基本概念:

节点(Node):B树和B+树的数据存储在节点中。节点可以包含多个关键字和对应的指针。在B树中,叶子节点和内部节点的结构相同,都存储数据和关键字。而在B+树中,叶子节点只存储关键字和指向数据的指针,而内部节点存储关键字和指向子节点的指针。

关键字(Key):关键字是B树和B+树中用于对数据进行排序和搜索的值。关键字按照升序排列,并被存储在节点中。

指针(Pointer):指针用于连接节点,形成树的结构。在B树和B+树中,指针可以指向子节点、父节点或兄弟节点,实现树的平衡。

根节点(Root Node):根节点是B树和B+树的顶层节点。它是树的起点,通过根节点可以访问到整个树的结构。

叶节点(Leaf Node):叶节点是树的最底层节点。在B树中,叶节点存储数据和关键字。而在B+树中,叶节点只存储关键字和指向数据的指针。叶节点之间通过指针进行连接,形成一个有序的双向链表。

内部节点(Internal Node):内部节点是B树和B+树中非叶节点。它们用于指向子节点,并存储关键字。

B树和B+树作为自平衡的搜索树,具有增删改查的操作,每次操作后都会进行平衡以保持树的高度接近最小值。这样可以确保查询效率的稳定性,并提供高效的范围查询和区间搜索能力。

以上是B树和B+树的基本概念,它们在实际应用中有着广泛的应用,尤其在数据库和文件系统中用于管理和查找大量数据。


B+树

        B+树相对于B树主要有一个关键区别,那就是在每个子节点之间添加了指针。在B+树中,所有的数据记录都存储在叶子节点上,而非叶子节点只存储索引信息。每个非叶子节点都有指向其子节点的指针,形成一个链表结构,这个链表结构使得在范围查询时更加高效。而对于B树,非叶子节点既存储索引信息又存储部分数据记录。所以可以说B+树的设计更适合在数据库等需要范围查询的场景中使用。这种设计有效地减少了磁盘I/O操作的次数,提高了查询效率。

当谈到B+树和B树的区别时,以下是一些重要的方面需要考虑:

  1. 数据记录存储:在B树中,每个节点都包含索引和对应的数据记录。而在B+树中,只有叶子节点包含数据记录,而非叶子节点只包含索引信息。这使得B+树的叶子节点形成了一个有序链表,便于范围查询操作。

  2. 非叶子节点的指针:在B树中,非叶节点包含指向子节点的指针。而在B+树中,非叶子节点只包含指向子节点的指针,并且这些指针形成了一个链表结构。这样的设计可以更快地在范围查询时遍历数据。

  3. 查询性能:由于B+树的叶子节点上存储了较多的数据记录,并且有序排列,所以范围查询效率更高。而B树需要在非叶子节点和叶子节点之间来回检索,相对而言,范围查询的性能较差。

  4. 插入和删除操作:对于B+树来说,由于只需调整叶子节点的指针,所以插入和删除操作相对较快。而B树在插入和删除时可能需要在非叶子节点之间进行调整。

总体来说,B+树在数据库系统中更为常见,尤其在需要范围查询和排序的场景中非常适用。对于大型数据库,B+树的使用可以提供更高的性能和效率。而B树在一些特殊场景中可能仍然有其应用,但在绝大多数情况下,B+树是更好的选择。

B+树复杂度

B+树的复杂度取决于具体的操作,下面是一些常见操作的复杂度分析:

  1. 插入和删除:B+树的插入和删除操作通常具有O(log N)的时间复杂度,其中N是树中的节点数。插入和删除通常需要在树的高度上进行搜索,并且在找到合适的位置后,可能需要进行节点的分裂或合并操作。

  2. 查找:B+树的查找操作也具有O(log N)的时间复杂度。通过从根节点开始,根据索引值逐级搜索子节点,直到叶子节点找到目标记录。

  3. 范围查询:由于B+树的叶子节点形成有序链表,使得范围查询操作非常高效。通过定位范围的起始和结束位置,可以在O(log N + M)的时间复杂度内定位到范围内的M个记录。

注意:这些复杂度分析是对平衡的B+树而言。在实际使用中,性能可能受到硬件、存储引擎、数据分布和索引设计等多个因素的影响。因此,在特定情况下,可能需要进一步考虑这些因素以获得更准确的性能评估。

提供一个网址可手动看见树的工作流程

B-Tree Visualization

详解工作流程

  1. B+树的根节点是一个特殊的节点,存储在内存中,并且是树的入口点。根节点可以包含一些索引信息,指向下层节点。

  2. 当需要插入一条记录时,首先从根节点开始,按照索引值逐级向下搜索,找到合适的叶子节点。在叶子节点中,根据索引值的顺序将记录插入到合适的位置。

  3. 如果插入操作导致叶子节点超过了预设的容量,会进行节点的分裂操作。分裂会创建一个新的叶子节点,并将一部分记录移动到新节点中。同时,更新上层节点的索引信息以反映叶子节点的变化。

  4. 当需要删除一条记录时,同样从根节点开始搜索,找到包含目标记录的叶子节点,并将其删除。

  5. 如果删除操作导致叶子节点的记录数过少,会进行节点的合并操作。合并操作会将相邻的叶子节点合并为一个节点,并更新上层节点的索引信息。

  6. 在B+树中进行范围查询时,首先定位到起始位置和结束位置所在的叶子节点,然后按照链表结构遍历那些在范围内的叶子节点,找到满足条件的记录。

总之,B+树的工作流程是从根节点开始,按索引值逐级搜索,最终找到叶子节点来插入、删除或查询记录。在修改树的结构时,可能需要进行节点的分裂和合并操作,以保持树的平衡性。这种工作流程使得B+树在数据库中成为一种高效的索引结构,适用于大规模数据存储和高性能查询的场景。

相对于B树的升级点以及特性点

  1. 范围查询效率更高:B+树的叶子节点形成有序链表,使得范围查询操作更高效。通过链表结构,可以轻松地在范围内遍历叶子节点,从而实现更快速的范围查询。

  2. 只有叶子节点存储数据记录:在B+树中,只有叶子节点存储数据记录,而非叶子节点只存储索引信息。这种设计减少了冗余数据的存储,提高了数据存储的效率。

  3. 非叶子节点的指针:B+树的非叶子节点包含指向子节点的指针,并形成链表结构。这样的设计使得范围查询更高效,因为只需要在链表上遍历节点,而不需要返回到父节点进行下一步搜索。

  4. 插入和删除操作更高效:插入和删除操作只需要在叶子节点上进行操作,而不需要涉及到上层非叶子节点。这样可以减少操作的复杂性和开销,提高了插入和删除操作的效率。

  5. 有利于磁盘I/O的优化:B+树的有序链表结构有利于优化磁盘I/O操作。通过顺序读取叶子节点的数据记录,可以减少随机I/O的次数,提高磁盘访问的效率。

  6. 适用于大型数据库系统:由于B+树的优化特性,它更适用于大型数据库系统。B+树在处理大量数据和频繁查询时表现良好,具有更好的查询性能和数据存储效率。

总体而言,B+树相对于B树提供了更高效的范围查询、更高的插入和删除效率以及更好的存储效率。这使得B+树成为了许多数据库系统中常用的索引结构。

mysql中的B+树

在MySQL中,B+树被广泛应用于索引结构。B+树在数据库系统中解决了多个问题,并且成为了一种优秀的索引方案,这也是为什么它被使用的原因之一。

以下是MySQL中B+树的应用和解决的问题:

  1. 高效数据访问:B+树的有序链表结构和索引在叶子节点的使用,使得在数据库中高效地访问和查询数据成为可能。通过树的平衡和有序性,B+树的查询操作可以在最坏情况下以O(log N)的时间复杂度完成,这意味着即使对于大量数据,查询也可以很快完成。

  2. 范围查询优化:B+树的特性之一是叶子节点形成有序链表,这使得范围查询的执行非常高效。例如,对于给定的范围条件,可以直接定位到范围内的第一个叶子节点,并沿着链表顺序遍历到最后一个满足条件的叶子节点,从而减少了搜索的次数。

  3. 数据排序:B+树可以根据索引的有序性来对数据进行排序。当表使用B+树作为主键索引时,在插入新记录或更新现有记录时,B+树会自动维护有序性。

  4. 减少磁盘访问:B+树的有序链表结构和索引的使用有助于优化磁盘I/O操作。通过顺序读取叶子节点,可以减少磁盘随机I/O的次数,从而提高了查询性能。

  5. 支持快速插入和删除:B+树的插入和删除操作通常只需要操作叶子节点,不涉及上层非叶子节点。这减少了操作的复杂性和开销,提高了插入和删除操作的效率。

总的来说,MySQL中的B+树应用广泛,它解决了高效数据访问、范围查询优化、数据排序和减少磁盘访问等问题。使用B+树作为索引结构可以提供更好的查询性能、支持大型数据库系统,并且具备高效的数据插入和删除操作。

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

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

相关文章

flask中的操作数据库的插件Flask-SQLAlchemy

1、ORM 框架 Web 开发中,一个重要的组成部分便是数据库了。Web 程序中最常用的莫过于关系型数据库了,也称 SQL 数据库。另外,文档数据库(如 mongodb)、键值对数据库(如 redis)近几年也逐渐在 w…

sql:SQL优化知识点记录(十二)

(1)读锁案例讲解 加读锁和写锁 查看是否上锁:In_use:变成了1 读写锁对我们数据产生哪些影响: 读锁:是共享锁,其他线程可以查看: 加了读锁:session1不能修改自己&#xf…

使用Vue3和Vite升级你的Vue2+Webpack项目

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

Opencv图像暗通道调优

基于雾天退化模型的去雾算法,Opencv图像暗通道调优,(清华版代码)对普通相片也有较好的调优效果,相片更通透。 结合代码实际运行效果、算法理论模型、实际代码。我个人理解,实际效果是对图像的三个颜色通道…

React三属性之:refs

作用 refs是为了获取节点,使用场景主要在需要操作dom的时候,比如echarts,就需要真实的dom节点 使用 import React from "react"; class RefsTest extends React.Component{state {value:输入框的值}refPlan React.createRef()logRef ()>{console.log(this.r…

重拾html5

新增的position: sticky; 基于用户的滚动位置来定位,粘性定位的元素是依赖于用户的滚动,在 position:relative 与 position:fixed 定位之间切换。ie15以上的低版本不支持,Safari 需要使用 -webkit- prefix; vertical-align: midd…

WPF_布局基础

布局容器 Grid 定义由列和行组成的灵活的网格区域。 行 <Grid.RowDefinitions><RowDefinition/><RowDefinition/></Grid.RowDefinitions> 列 <Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDe…

【MySQL基础|第一篇】——谈谈SQL中的DDL语句

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】&#x1f388; 本专栏旨在分享学习MySQL的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 前言&#xff…

【群答疑】jmeter关联获取上一个请求返回的字符串,分割后保存到数组,把数组元素依次作为下一个请求的入参...

一个非常不错的问题&#xff0c;来检验下自己jmeter基本功 可能有同学没看懂题&#xff0c;这里再解释一下&#xff0c;上面问题需求是&#xff1a;jmeter关联获取上一个请求返回的字符串&#xff0c;分割后保存到数组&#xff0c;把数组元素依次作为下一个请求的入参 建议先自…

Spring-mvc的参数传递与常用注解的解答及页面的跳转方式---综合案例

目录 一.slf4j--日志 二.常用注解 2.1.RequestMapping 2.2.RequestParam 2.3.RequestBody 2.4.PathVariable 三.参数的传递 3.1 基础类型 3.2 复杂类型 3.3 RequestParam 3.4 PathVariable 3.5 RequestBody 3.6 增删改查 四.返回值 4.1 void 返回值 4.2 String 返…

在Linux系统启动java程序(jar包)

文章目录 1. mvn install生成jar包2. 利用ftp工具将jar包上传到linux服务器3. 在linux服务器上启动jar包3.1 直接启动jar包3.2 后台启动jar包3.3 后台不挂断启动jar包3.4 后台不挂断启动jar包并输出日志到指定文件3.5 其他 1. mvn install生成jar包 2. 利用ftp工具将jar包上传到…

Android——数据存储(二)(二十二)

1. SQLite数据库存储 1.1 知识点 &#xff08;1&#xff09;了解SQLite数据库的基本作用&#xff1b; &#xff08;2&#xff09;掌握数据库操作辅助类&#xff1a;SQLiteDatabase的使用&#xff1b; &#xff08;3&#xff09;可以使用命令操作SQLite数据库&#xff1b; …

Unity 编辑器资源导入处理函数 OnPostprocessTexture :深入解析与实用案例

Unity 编辑器资源导入处理函数 OnPostprocessTexture 用法 点击封面跳转下载页面 简介 在Unity中&#xff0c;我们可以使用编辑器资源导入处理函数&#xff08;OnPostprocessTexture&#xff09;来自定义处理纹理资源的导入过程。这个函数是继承自AssetPostprocessor类的&…

Liquid Studio 2023.2 Crack

Liquid Studio 提供了用于XML和JSON开发 的高级工具包以及Web 服务测试、数据映射和数据转换工具。 开发环境包含一整套用于设计 XML 和 JSON 数据结构和模式的工具。这些工具提供编辑、验证和高级转换功能。对于新手或专家来说&#xff0c;直观的界面和全面的功能将帮助您节省…

linux 进程管理命令

进程管理命令 查看进程命令 ps命令 显示系统上运行的进程列表 # 查看系统中所有正在运行的系统ps aux# 获取占用内存资源最多的10个进程&#xff0c;可以使用如下命令组合&#xff1a;ps aux|head -1;ps aux|grep -v PID|sort -rn -k 4|head# 获取占用CPU资源最多的10个进程&am…

C语言sizeof()计算空间大小为8的问题

在练习数据结构过程中&#xff0c;定义指针p&#xff0c;并且申请了10个char类型空间&#xff0c;但在计算p所指空间大小时候&#xff0c;发现了一些奇怪的现象。 #include <stdio.h> #include <stdlib.h>int main(){char s[12];printf("the size of memory …

FPN模型

【简介】 2017年&#xff0c;T.-Y.Lin等人在Faster RCNN的基础上进一步提出了特征金字塔网络FPN(Feature Pyramid Networks)技术。在FPN技术出现之前&#xff0c;大多数检测算法的检测头都位于网络的最顶层(最深层)&#xff0c;虽说最深层的特征具备更丰富的语义信息&#xff0…

一种改进多旋翼无人机动态仿真的模块化仿真环境研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

论文解读 | KPConv——点云上的可形变卷积网络

原创 | 文 BFT机器人 《KPConv: Flexible and Deformable Convolution for Point Clouds》是一篇发表于2019年的研究论文&#xff0c;作者为Hugues Thomas、Charles R. Qi、Jean-Emmanuel Deschaud、Beatriz Marcotegui和Franois Goulette。这篇论文关注于点云数据上的卷积操作…

小白学go基础04-命名惯例对标识符进行命名

计算机科学中只有两件难事&#xff1a;缓存失效和命名。 命名是编程语言的要求&#xff0c;但是好的命名却是为了提高程序的可读性和可维护性。好的命名是什么样子的呢&#xff1f;Go语言的贡献者和布道师Dave Cheney给出了一个说法&#xff1a;“一个好笑话&#xff0c;如果你…