MySQL为何不选择平衡二叉树

既然平衡二叉树解决了普通二叉树的问题,那么mysql为何不选择平衡二叉树作为索引呢?

索引需要存储什么

让我们想一想,如果我们要把索引存起来,那么应该存哪些信息呢,它应该存储三块信息:

  • 索引的值:就是表里面索引列对应的值。

  • 数据的磁盘地址(通过磁盘地址找到当前数据)或者直接存储整条数据。

  • 子节点的引用:我们需要从根节点往下走,所以需要知道左右子节点的地址。 根据这三点,可以有如下大致的一个简单的结构图:

上图中数字表示的是索引的值,0x开头的表示磁盘地址,根节点中存了左右节点的引用。

AVL树用来存储索引存在什么问题

我们知道,页(Page)是 Innodb 存储引擎用于管理数据的最小磁盘单位,页的默认大小为16KB。页也就是上图中的节点,每查询一次节点就需要进行一次IO操作,IO操作是一种非常耗时的操作,很多业务系统的瓶颈都是卡在IO操作上,所以如果我们需要提高查询效率的办法之一就是减少IO次数,那么问题就来了,AVL树一个节点上只存了一个关键字(索引值)+一个磁盘地址+左右节点的引用,这是远远达不到16KB的,会浪费了大量的空间。

上图中如果我们要找到6这条数据,需要进行3次IO(获取一个节点就是一个IO操作),如果这棵树很高的话,就会进行大量的IO操作,所以说AVL树存在的最大问题就是空间利用不足,浪费了大量空间,数据量大的时候就会成为一颗瘦高的树,那么我们可以怎么改进呢?答案很明显了,那就是每个磁盘块多存一点东西,也就是说每个磁盘多存几个关键字,因为关键字越多,路数越多;路数越多,树也就越矮越胖,相应的操作IO次数就会越少。

多路平衡树(Balanced Tree)

多路平衡树简称B树,又称B-树,和AVL树一样,B树在枝节点和叶子节点存储键值、磁盘地址、左右节点引用。请看下图的一个多路平衡树的示例:

B树的特点

相比较AVL树,B树一个磁盘上可以存多个关键字(值),而且有一个特点就是:

  • 分叉数(路数)永远比关键字数多1。 我们可以画出如下简图(下图中只画了3路,即两个关键字,实际取决于一页能存储多少个关键字):

从上图可以很明显的看出,同样高度的树,B树能存的数据远远大于平衡二叉树。

B树是如何查找数据的

以上图为例,假如我们要找key=32这个数字,首先获取到根节点,发现18小于key,所以往右边走,获取到右边的数据,54和76,这时候遵循以下原则:

  • key<54,命中最左边分叉;

  • key=54,直接命中,返回数据;

  • 54<key<76,走中间的一个分叉;

  • key=76,直接命中,返回数据;

  • key>76,命中右边分支; 这里因为key=32,所以走得是第1条,命中左边分支,这时候再去获取左边分支,获取到32和50,比较发现key=32,命中,返回数据。

从上面我们可以看出B树效率相对于AVL树,在数据量大的情况效率已经提高了很多,那么为什么MySQL还是不选择B树作为索引呢? 那么接下来让我们先看看改良版的B+树,然后再下结论吧!

B+树

B+树由B树改良而来,属于改良版的多路平衡查找树。 首先让我们来看看B+树到底长什么样呢:

对比B+树,我们可以发现一个很明显的区别就是叶子节点有一个箭头指引而且从左到右是有序的。

InnoDB中使用的B+树相比较于传统B+树,改进之后的B+树具有以下特点

InnoDB中B+树的特点

  • 它的关键字的数量是跟路数相等的。

  • B+树的根节点和枝节点中都不会存储数据,只有叶子节点才存储数据。而搜索到关键字不会直接返回,会到最后一层的叶子节点。

  • B+树的每个叶子节点增加了一个指向相邻叶子节点的指针,它的最后一个数据会指向下一个叶子节点的第一个数据,形成了一个有序链表的结构。

  • 它是根据左闭右开的区间来检索数据的 按照B+树的特点,我们可以画出一个存储数据的简图,如下:

最后

这次要给大家分享总结的东西就是这些了

资料全都放在——***我的学习笔记:大厂面试真题+微服务+MySQL+Java+Redis+算法+网络+Linux+Spring全家桶+JVM+学习笔记图***

最后再分享一份终极手撕架构的大礼包(学习笔记):分布式+微服务+开源框架+性能优化

笔记图](https://gitee.com/vip204888/java-p7)***

最后再分享一份终极手撕架构的大礼包(学习笔记):分布式+微服务+开源框架+性能优化

Java开发还不会这些?java制作连连看教程相关推荐

  1. 重庆找Java开发工作_重庆【Java开发程序员】

    重庆[Java开发程序员],提倡一切为了学员就业的办学思想,教学过程中坚持以练习企业项目为主,让学员真正能学到技术,毕业就能适应工作岗位. 重庆[Java开发程序员], Java 编程开发.而且很多软 ...

  2. java 开发人员工具_每个Java开发人员都应该知道的10个基本工具

    java 开发人员工具 大家好,我们已经到了2019年的第二个月,我相信你们所有人都已经制定了关于2019年学习以及如何实现这些目标的目标. 我一直在撰写一系列文章,为您提供一些知识,使您可以学习和改 ...

  3. java 操作vss,java开发常用工具总结,java开发常用工具

    java开发常用工具总结,java开发常用工具 1.editplus editplus 是我使用最频繁的工具,不管是java程序还是其他的语言的程序,本人都使用它,方便好用,速度快.如果配置好的话,可 ...

  4. 哈尔滨java开发工资_给哈尔滨Java开发初学者的几个学习建议

    对于初学者应该如何学习Java开发技术,纵观中国目前整体行业来说,互联网IT行业成为了拔尖的行业,IT互联网程序开发成了靠自己能力可以多挣一点钱,所以各个行业都在转行,其实互联网不存在饱和,只不过大多 ...

  5. 零基础学习java开发还行吗

    java程序员饱和了吗? 这个是老话题了,java程序员远远没有饱和,年薪10万+元是很正常的一个薪酬水平.现在java程序员挺多的,但是职位需求量更大,特别是能干实干或优秀的程序员是相当缺乏的,没存 ...

  6. java开发面试复试_面试java开发,面试官会问哪些问题?

    作为一个当初从学校刚毕业找工作而被面试饱经摧残的小白,到现在的java开发从业人员,中间不可谓之不艰辛,当初的屡屡碰壁,工作受挫,一直到现在我仍然认为那是我人生中不可或缺的一段经历. 关于面试的艰辛这 ...

  7. Java开发和运行环境的搭建(详细教程)

    对JDK.JRE.Java 的认识 JDK 是Java Development Kit的缩写,即Java开发工具集.JDK是整个Java的核心,包括了Java运行环境(JRE).Java开发工具和Ja ...

  8. 适用于Java开发人员的Elasticsearch:Java的Elasticsearch

    本文是我们学院课程的一部分,该课程的标题为Java开发人员的Elasticsearch教程 . 在本课程中,我们提供了一系列教程,以便您可以开发自己的基于Elasticsearch的应用程序. 我们涵 ...

  9. java开发项目实例_Alibaba内部出品Java突击手册,大量开发实战项目分享

    前言 Java作为目前最受欢迎的语言,每年都会有很多转行.跨行等等地人加入到开发大军中来,但是Java开发也是会遇到瓶颈的,当我们遇到瓶颈的时候就会去寻求发展突破,尤其是从Java开发高级工程师向架构 ...

  10. 吉比特java开发_JVM 吉比特后台 Java 开发实习生 20 分钟一轮游 _好机友

    吉比特后台 Java 开发实习生 20 分钟一轮游 作者:胖若两人 链接:https://www.nowcoder.com/discuss/155198?type=2&order=3& ...

最新文章

  1. 面试后说hold什么意思_民间说的命硬是什么意思?
  2. 安卓学习笔记28:文件流操作
  3. .net Asp AdRotator(广告控件)
  4. java 调用bat脚本 等待返回_java程序调用bat脚本
  5. 联合循环—— 35燃气轮机发电机结构及变频启动系统
  6. 移动体验大作战,冰桶算法全盘点
  7. matlab怎么启动一个图形窗,Matlab在一个图形窗口里画多个图形的操作教程
  8. 4384---一方通行与最后之作 (sdut oj)
  9. Python学习笔记--Python 爬虫入门 -17-5 js 加密 (和有道词典的瓜葛)
  10. 《排列字母》把字符串中的字母按其在字母表中的顺序排列。
  11. 没有预算的新媒体运营如何启动?
  12. MS SQL 2005 32/64位下载
  13. 为什么CynosDB叫真正的云原生数据库?
  14. 使用ffmeg的7个技巧
  15. 驻留内存 虚拟内存 共享内存
  16. (病毒安全)电脑装多款杀毒软件可以吗?
  17. 计算机网络——数字数据的数字编码
  18. 程序员的机器学习入门笔记(十):人脸识别核心算法PCA的前世与今生(强烈推荐)
  19. 基于 WEB 的室内温湿度监测系统(树莓派)
  20. python多线程抢红包代码_Python有哪些神一般的骚操作? 远远不止抢车票、抢红包《附代码》...

热门文章

  1. 弘辽科技:拼多多现金红包0.01怎么破?如何领现金?
  2. 如何用纯 CSS 创作一个雷达扫描动画
  3. Docker高级篇-Docker容器内Redis集群配置
  4. 页面导成Word时实现横向打印
  5. 语音合成(TTS论文优选:VocGAN: A High-Fidelity Real-time Vocoder with a Hierarchically-nested Adversarial Netw
  6. 【大学生软件测试基础】计算房产基础中介费 - 决策表
  7. bochs2.6.9 配置文件详解.和相关调试到虚拟机运行
  8. 在李佳琦的直播间里,看不到华熙生物的未来
  9. Linux内核源代码目录树结构
  10. kali实战:获取内网目标图片