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+树的特点,我们可以画出一个存储数据的简图,如下:

线程、数据库、算法、JVM、分布式、微服务、框架、Spring相关知识

一线互联网P7面试集锦+各种大厂面试集锦

资料领取方式:戳这里

学习笔记以及面试真题解析

08626)]

资料领取方式:戳这里

学习笔记以及面试真题解析

MySQL最全整理!西安java培训机构排名榜相关推荐

  1. 2023年西安Java培训机构十强榜单出炉,快来看看哪家榜上有名~

    关于"西安Java培训机构哪家好?""如何选择适合自己的Java培训机构?"这类问题常常出现网络上,其实关于这类问题没有统一的答案,一千个人有一千个哈姆雷特,每 ...

  2. 上海Java培训机构排名榜单已出炉,实力学员推荐不看后悔

    学习Java编程不在是校内学生们的专利了,随着职场上竞争越来越激烈,毫无基础的或想要转行的求职者对于学习Java的积极性也是越来越高,因此,市面上涌现了大批的成人Java培训机构,为了不让大家纠结,小 ...

  3. 广州Java培训机构排名榜单亲身经历说说看

    如今社会上的就业竞争非常激烈,许多公司都在不断的提高对求职者的需求,大家也逐渐的开始意识到掌握一项适用的技能是非常重要的,一技之长不仅能够给我们带来就业上的巨大优势,还能提高我们的薪资收入,让我们更上 ...

  4. 深圳Java培训机构排名榜单:动力节点上榜,第一名耳熟能详

    对于想要学Java的人来说,参考深圳Java培训机构排名榜单是最有效率的选择培训机构的方法,随着近些年学Java编程的人数暴增,Java培训市场也得到了极大的发展,Java培训机构数量空前的多,从而市 ...

  5. MySQL最全整理!java垃圾回收器的作用不包括

    零基础如何学习Java? 首先,你要明白一点,Java入门不难! 无论你是从事哪个行业,兴趣一定是最好的老师,也是你学习的动力. 学习方式1:自学 自学模式其实我个人不建议绝大部分的人选择,因为自学是 ...

  6. Java程序员必会!西安java培训机构哪个靠谱

    前言 并发编程是Java程序员最重要的技能之一,也是最难掌握的一种技能.它要求编程者对计算机最底层的运作原理有深刻的理解,同时要求编程者逻辑清晰.思维缜密,这样才能写出高效.安全.可靠的多线程并发程序 ...

  7. 成功入职字节跳动!南京java培训机构排名榜

    1. 前言 相信大家对 ZooKeeper 应该不算陌生.但是你真的了解 ZooKeeper 到底有啥用不?如果别人/面试官让你给他讲讲对于 ZooKeeper 的认识,你能回答到什么地步呢? 拿我自 ...

  8. 重庆java培训机构排名榜

    前言 说到CAS(CompareAndSwap),不得不先说一说悲观锁和乐观锁,因为CAS是乐观锁思想的一种实现. 悲观锁:总是很悲观的认为,每次拿数据都会有其他线程并发执行,所以每次都会进行加锁,用 ...

  9. 武汉Java培训机构排名最新数据,这家机构始终名列前茅

    说起Java大家一定不陌生,毕竟Java这几年通过互联网+理念慢慢的渗透到了各大行业中,现在的Java软件开发岗位尤为火爆.同时也吸引着不少年轻人选择通过Java培训加入到行业中,在武汉,Java培训 ...

最新文章

  1. python好学吗mooc中文网-用Python玩转数据
  2. f5 会话保持 负载均衡_四层负载均衡和七层负载均衡区别在哪里?
  3. 近世代数--环同态--环的第二同构定理
  4. Winsock Error Codes
  5. Android小项目源码汇总
  6. P1829 [国家集训队]Crash的数字表格(推了好久的mobius反演)
  7. Servlet 组件相关的接口、抽象类关系图
  8. 【渝粤题库】国家开放大学2021春2625调剂学题目
  9. python 隐马尔科夫_机器学习算法之——隐马尔可夫(Hidden Markov ModelsHMM)原理及Python实现...
  10. Bootstrap模态框居中显示
  11. STL6-输入输出流
  12. 数字系统设计学习之QuartusII9的安装
  13. 21天Jmeter打卡Day11配置元件之CSV数据文件配置
  14. python脚本开发_python
  15. jdk源码阅读-HashMap
  16. python如何运行_家长看的懂的Python编程---电脑要如何运行Python?
  17. 开发电脑应该是8核(8线)
  18. 【转】Chrome与Chromedriver版本对应表(最新)【附下载链接】
  19. log4j日志整合输出(slf4j+commonslog+log4j+jdklogger)
  20. layUI table表格合并

热门文章

  1. 树莓派3B和4B的SoC性能比较
  2. Python单步运行方法
  3. [Html]JS实现看不到源代码
  4. pr竖屏模板,极致简约创意时尚图文手机视频模板
  5. 智立方董事长杨石头经典语录(仅供…
  6. perl chop和chomp函数区别
  7. compareto java date_Java Date compareTo()用法及代码示例
  8. 公众号开发需要学什么_公众号的开发方式有哪些
  9. 易语言php注册,易语言简单ASP网络验证源码 PHP一键搭建网络验证源码
  10. 怎样取消苹果手机x的静音设置_iPhoneX拍照声音怎么关?苹果iPhoneX相机声音关闭方法...