浅析Mysql索引数据结构演变,让你一看就懂

1、一个节点只能有两个子节点,也就是一个节点度不能超过2
2、左子节点 小于 本节点;右子节点大于等于 本节点

我们看一下上面的数据,以id为索引,建立的二叉树的结构是什么?
图片
因为二叉数的特点,右边比左边大,这次我们查询id=51,只需要比较3次,因为有一部分数据是不需要比较的,再索引建立的时候就已经排序好了

这个二叉树比之前的遍历的方案,性能提高了很多。但他也有一个问题,如果id的值是持续递增的话,会是什么样的结构?

图片
我们发现如果id是持续递增的话,我们的二叉树结构出现了残缺,如果这个时候查找id=5,也是从一直遍历到最后,没有像之前的数据那样,排除掉一部分数据。那怎么解决?

红黑树

红黑树的出现就可以解决这个问题,红黑树的特点会自动平衡树,其他特点(小伙伴们自行度娘)。我们看一下红黑树怎么平衡?
图片图片

上面两个图,左图在插入数值为3时,红黑树的算法发现有偏向,就会重新调整树结构;调整到右边的图

那我们可以看看,之前的数据1~6持续递增的树,会变成什么样图片
我们看到红黑树的结构,这样我们再次查找数据为5,只需要比较3次,有部分数据被提前排序了。红黑树很好的平衡了树的偏向问题,但红黑树问题也比较大。

1、每次都要检查规则,再把树进行重新平衡,这个是非常消耗时间的
2、数据量大的话,红黑树的深度会比较深,树一旦深就代表着我们读取磁盘次数就会增加

B树

小伙伴们有没有发现,影响数据查询时间的是树的高度,高度越高,我们需要比较的次数越多,那我们是不是可以想办法把树的高度弄低点?那我们的B树数据结构就由此产生。
B树的特点
假如当前有一颗m阶的B树(注意阶的意思是指每个节点的孩子节点的个数),那么其符合

(1)每个节点最多有m个子节点
(2)除了根节点和叶子节点之外,其他的每个节点最少有m/2(向上取整)个孩子节点
(3)根节点至少有两个孩子节点,(除了第一次插入的时候,此时只有一个节点,根节点同时是叶子节点)
(4)所有的叶子节点都在同一层
(5)有k个子节点的父节点包含k-1个关键码
(6)所有的叶节点都在同一层
(7)每个节点中的子节点都是从左到右排序的

小伙伴们是不是看到这个比较晕这么多的特点(其实还有更多性质,老顾也记不住);其实我们不需要记住这么多的特点,只要记住几个核心点,先看图
图片
我们的主要目标就是把树的高度弄低,上图中,我们可以看到之前的一个节点里面多了几个子节点(即几阶树)【核心点一】,这样的设计就是把之前节点只存储1个数值,现在可以存储多个数值。

多个子节点数值都是从左到右排序核心点二有便于快速查找。而且叶节点具有相同的深度,保证了每个数值查询效率一致核心点三】。

图中每个节点里面都包含具体信息data核心点四】,再查询的时候找到对应的索引后,直接取出这个节点中的信息。

B树的核心思想就是把树高度弄低,用了树节点包含多个子节点的设计思想,上图中一个树节点包含3个子节点。

小伙伴有没有过这个想法,那我们可以把树节点包含更多子节点,10个、100个、甚至1万个,这样就让树高度越来越小,甚至就只有一个树根节点,**这样不是更好吗?**往下看

硬盘原理

这里就涉及到计算机原理的知识了,用通俗的图表示一下图片图片
读取数据流程主要交给磁头和磁盘,我们的数据存放在每个扇区中,要读取一个扇区数据,需要把磁头移动到相应的磁道上面,然后磁盘快速旋转,从而读取到里面值。(详细知识自行度娘)

整个过程磁头寻道是比较慢的,我们与硬盘的交互尽量减少寻道这个动作

上面小伙伴有个疑问,我们能否扩大树节点中的子节点数,甚至只有一个根节点就行了。这个是不行的,因为小伙伴们不要忘了,**内存也是有限的,**所有数据存储在一个根节点中,数据量一旦上亿就吃不消了。

其实本质还有一个基本知识就是**【磁盘有预读机制,每次读的时候都是加载一个磁盘页到内存里面】,这话的理解就是一次磁盘I/o读取只能读一个磁盘页大小(4kb)的数据到内存中,也就是8kb的数据,要磁盘i/o的2次操作。
就是因为这个磁盘预读机制,也就是不可能树的节点随便我们设置,应该树节点的数据量正好是一个磁盘页的大小,这样
效率最高**,一次IO读取一个树节点。

B+树

有了上面的知识铺垫,终于到了这里。我们来看一下上面的B树,一个树节点我们应该尽可能的包含更多的子节点,但又不能超过一个磁盘页(4kb)的大小
我们小伙伴们是不是想到进一步的优化点,我们发现B树的节点中还包含了一些关键字信息data,这个data也占据着一定的数据量,我们是不是可以把data去掉,这样就又能多加几个子节点了。这也就是B+树的核心思想,看图图片
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

分享一套我整理的面试干货,这份文档结合了我多年的面试官经验,站在面试官的角度来告诉你,面试官提的那些问题他最想听到你给他的回答是什么,分享出来帮助那些对前途感到迷茫的朋友。

面试经验技巧篇
  • 经验技巧1 如何巧妙地回答面试官的问题
  • 经验技巧2 如何回答技术性的问题
  • 经验技巧3 如何回答非技术性问题
  • 经验技巧4 如何回答快速估算类问题
  • 经验技巧5 如何回答算法设计问题
  • 经验技巧6 如何回答系统设计题
  • 经验技巧7 如何解决求职中的时间冲突问题
  • 经验技巧8 如果面试问题曾经遇见过,是否要告知面试官
  • 经验技巧9 在被企业拒绝后是否可以再申请
  • 经验技巧10 如何应对自己不会回答的问题
  • 经验技巧11 如何应对面试官的“激将法”语言
  • 经验技巧12 如何处理与面试官持不同观点这个问题
  • 经验技巧13 什么是职场暗语

面试真题篇
  • 真题详解1 某知名互联网下载服务提供商软件工程师笔试题
  • 真题详解2 某知名社交平台软件工程师笔试题
  • 真题详解3 某知名安全软件服务提供商软件工程师笔试题
  • 真题详解4 某知名互联网金融企业软件工程师笔试题
  • 真题详解5 某知名搜索引擎提供商软件工程师笔试题
  • 真题详解6 某初创公司软件工程师笔试题
  • 真题详解7 某知名游戏软件开发公司软件工程师笔试题
  • 真题详解8 某知名电子商务公司软件工程师笔试题
  • 真题详解9 某顶级生活消费类网站软件工程师笔试题
  • 真题详解10 某知名门户网站软件工程师笔试题
  • 真题详解11 某知名互联网金融企业软件工程师笔试题
  • 真题详解12 国内某知名网络设备提供商软件工程师笔试题
  • 真题详解13 国内某顶级手机制造商软件工程师笔试题
  • 真题详解14 某顶级大数据综合服务提供商软件工程师笔试题
  • 真题详解15 某著名社交类上市公司软件工程师笔试题
  • 真题详解16 某知名互联网公司软件工程师笔试题
  • 真题详解17 某知名网络安全公司校园招聘技术类笔试题
  • 真题详解18 某知名互联网游戏公司校园招聘运维开发岗笔试题

资料整理不易,点个关注再走吧
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 16
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值