当前位置: 首页 > news >正文

【高阶数据结构(七)】B+树, 索引原理讲解

💓博主CSDN主页:杭电码农-NEO💓

⏩专栏分类:高阶数据结构专栏⏪

🚚代码仓库:NEO的学习日记🚚

🌹关注我🫵带你学习更多数据结构
  🔝🔝


在这里插入图片描述

高阶数据结构

  • 1. 前言
  • 2. B+树讲解
  • 3. B*树讲解
  • 4. 索引原理
  • 5. 总结

1. 前言

B树并不常用,就是因为有B+树的存在. MySQL的索引底层其实就是使用了B+树,请听我娓娓道来

本章重点:

本篇文章着重讲解B+树, B*树的概念和结构, 讲解引擎:MyISAM和 InnoDB的索引的底层原理


2. B+树讲解

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

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

在这里插入图片描述

B+树的这个改进有效的减少了B树的消耗. 在最左边的叶子节点中, 是用链表将不同值链接起来的,并且父节点的关键字5就是链表的第一个元素, 链表中所有的元素都满足 5<=x<10. 所以可以看出, B树系列的数据结构就是一颗矮胖树,设计成为矮胖树的原因是查找时, 进行磁盘OI的次数少了,自然就提高效率了. 某种意义上来讲,B树系列更像是书本前面的目录, 方便你轻松的查找到一个值

在这里插入图片描述

B+树的分裂:

当一个结点满时,分配一个新的结点,并将原结点中1/2的数据复制到新结点,最后在父结点中增加新结点的指针;B+树的分裂只影响原结点和父结点,而不会影响兄弟结点,所以它不需要指向兄弟的指针。

分裂属于拓展,有兴趣可自行查资料


3. B*树讲解

B*树是B+树的变形,在B+树的非根和非叶子节点再增加指向兄弟节点的指针。

在这里插入图片描述

B*树的分裂:

当一个结点满时,如果它的下一个兄弟结点未满,那么将一部分数据移到兄弟结点中,再在原结点插入关键字,最后修改父结点中兄弟结点的关键字(因为兄弟结点的关键字范围改变了);如果兄弟也满了,则在原结点与兄弟结点之间增加新结点,并各复制1/3的数据到新结点,最后在父结点增加新结点的指针。所以,B*树分配新结点的概率比B+树要低,空间使用率更高;

在这里插入图片描述

虽然说B*树的空间利用率更高, 但是它的设计更绕更复杂, 所以在实际生活中, 反而B+树的运用场景比较多


4. 索引原理

B-树最常见的应用就是用来做索引。索引通俗的说就是为了方便用户快速找到所寻之物,比如:
书籍目录可以让读者快速找到相关信息,hao123网页导航网站,为了让用户能够快速的找到有价
值的分类网站,本质上就是互联网页面中的索引结构。

MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构,简单来说:索引就是数据结构。

在这里插入图片描述

MyISAM引擎: B+树

在这里插入图片描述

MyISAM引擎的B+树的叶子节点只是保存了表数据的地址, 当你通过索引查找对应的地址后, 再使用此地址直接找到数据. 这种索引方式称为非聚簇索引

InnoDB引擎: B+

InnoDB支持B+树索引、全文索引、哈希索引。但InnoDB使用B+Tree作为索引结构时,具体实现方式却与MyISAM截然不同。第一个区别是InnoDB的数据文件本身就是索引文件。MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而InnoDB索引,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引.

在这里插入图片描述

叶节点包含了完整的数据记录,这种索引叫做聚集索引. 因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键. 学过MySQL的伙伴可能知道, 不仅仅主键可以根据主键创建索引, 还有唯一键索引,普通索引等. 那么他们是怎样工作的呢? 答案是, 非主键索引的B+树的叶子节点中存储的是这一行对应的主键值, 然后再根据这个主键值去主键索引中找到所有数据


5. 总结

B树系列的应用一般是在磁盘,也就是外数据的查询, 它的思想是值得我们学习的

🔎 下期预告:跳表详解 🔍

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 多态(C++)
  • Ubuntu22.04之扩展并挂载4T硬盘(二百三十三)
  • 【typescript】omit和pick的好处,以及区别和用法
  • 怎么做好客户信息管理?
  • linux日常运维2
  • web前端三大主流框架
  • PHP preg_replace正则表达式涉及汉字乱码
  • c++——模板初始识
  • mysql内存和磁盘的关系
  • 数学建模——线性回归模型
  • Apache Doris 基础 -- 数据表设计(数据模型)
  • 充电器快充协议与PW6606快充电压诱骗芯片
  • Linux完整版命令大全(二十一)
  • 前端面试题12-22
  • 惯性测量单元M-G370系列广泛用于工业系统各个领域
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • AHK 中 = 和 == 等比较运算符的用法
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • codis proxy处理流程
  • const let
  • eclipse(luna)创建web工程
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Lsb图片隐写
  • Python爬虫--- 1.3 BS4库的解析器
  • python学习笔记 - ThreadLocal
  • React-redux的原理以及使用
  • 读懂package.json -- 依赖管理
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 诡异!React stopPropagation失灵
  • 前端性能优化——回流与重绘
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 消息队列系列二(IOT中消息队列的应用)
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 带你开发类似Pokemon Go的AR游戏
  • 说说我为什么看好Spring Cloud Alibaba
  • # Panda3d 碰撞检测系统介绍
  • (day18) leetcode 204.计数质数
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (二)fiber的基本认识
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (三)终结任务
  • (一) springboot详细介绍
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)Mysql的优化设置
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .net 验证控件和javaScript的冲突问题
  • .net打印*三角形
  • .Net小白的大学四年,内含面经
  • /bin、/sbin、/usr/bin、/usr/sbin