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讲的清清楚楚,明明白白,这应该是我目前为止看到过最好的有关MySQL的学习笔记了,我相信如果你把这份笔记认真看完后,无论是工作中碰到的问题还是被面试官问到的问题都能迎刃而解!

重要的事:需要领取完整版的MySQL学习笔记的话,请转发+关注后点这里免费获取到免费的下载方式!

MySQL50道高频面试题整理:

点这里免费获取到免费的下载方式!**

MySQL50道高频面试题整理:

看完老板就给加薪了!javase项目快速入门相关推荐

  1. 看完老板就给加薪了!轻松获得一线大厂面试offer,大厂面试题汇总

    我的移动开发春季历程 没有稳定的工作,只有稳定的能力. 春天,又到了万物复苏的季节,在程序猿这个行当里,作为 Android 开发出生的我,在经历了5年的脱发生涯后,现在更多的是称呼自己为移动开发攻城 ...

  2. python大神和小白代码_看大神6行代码如何带领小白快速入门Python爬虫?

    原标题:看大神6行代码如何带领小白快速入门Python爬虫? 可能是小编本身就有一定的基础!当然我没有瞧不起小白的看法,知识觉得要入门一门编程语言确实比较简单,而且小编本身也是从小白过来的,但是当初接 ...

  3. appinventor2 MySQL,写给大家看的安卓应用开发书 App Inventor 2快速入门与实战pdf

    没错,你有能力创建自己的安卓应用,而且一点都不难.AppInventor2,让你分分钟成为应用开发者! 本书由浅入深地介绍了强大的可视化编程工具AppInventor2,任何人都可以用它来开发自己的应 ...

  4. 看完 GitHub 上这几个奇葩项目后,我忍不住笑了 233333

    公众号关注 "GitHubDaily" 设为 "星标",每天带你逛 GitHub! 作者丨望京一哥小智 你用的 GitHub 跟我的好像不太一样? GitHub ...

  5. 看完这些干货帖,大数据产品从入门到精通

    欢迎来到"MVP教你玩转阿里云"系列教程,在这里,你将看到各行各业数字化转型的一线实践,学到资深开发者的经验结晶. 你将以云计算领域的技术领袖为师,加速了解阿里云技术产品和各行业数 ...

  6. web.xml文件位于web项目的目录结构中的_看完这篇,别人的开源项目结构应该能看懂了...

    我为什么要写这篇 近来,和不少初学Spring或Spring Boot的小伙伴私信交流了关于项目目录结构划分和代码分层的问题. 很多小伙伴表示网上下载下来的开源项目看不懂,项目结构和代码分层看得很蒙, ...

  7. 看完这篇,别人的开源项目结构应该能看懂了

    我为什么要写这篇 近来,和不少初学Spring或Spring Boot的小伙伴私信交流了关于项目目录结构划分和代码分层的问题. 很多小伙伴表示网上下载下来的开源项目看不懂,项目结构和代码分层看得很蒙, ...

  8. 在阿里工作5年了,看完这篇,别人的开源项目结构应该能看懂了

    很多小伙伴表示网上下载下来的开源项目看不懂,项目结构和代码分层看得很蒙,不知道应该以一个什么样的思路去学习和吸收别人的项目. 好,今天熬夜肝了这篇文章,和大家一起来交流探讨一下,不足之处也请小伙伴们批 ...

  9. 看完此文章若你还不能完美的入门Python,我将永远退出IT界

    0基础小白怎么学Python? 今天给大家分享一些学习Python的基本概念图,入门书籍.视频教程以及学习路上最有效的方法. Python基本概念最全图 1.Python 解释器: 2.Python数 ...

  10. cad通过钢筋大样生成钢筋明细表插件_如何设计一套建筑电气CAD施工图?看完你就知道!涨知识...

    电气施工图所涉及的内容往往根据建筑物不同的功能而有所不同,主要有建筑供配电.动力与照明.防雷与接地.建筑弱电等方面,用以表达不同的电气设计内容. 一 电气施工图的特点 (1) 建筑电气工程图大多是采用 ...

最新文章

  1. 无人机巡逻喊话、疫情排查、送药消毒,抗疫战中机器人化身钢铁战士!
  2. sql server 数据库备份方案
  3. c语言函数指针的理解与使用(学习)
  4. centos6.5 VNC安装步骤
  5. 在线阅读计算机组成,计算机组成原理RAM.pdf
  6. 《JS设计模式笔记》 5,适配器模式
  7. 2020年第十一届蓝桥杯 - 省赛 - Python大学组 - C.跑步锻炼
  8. 针对C++和Delphi的LiveBindings一瞥
  9. python报错:Cannot run the event loop while another loop is running
  10. 并行开发 4.同步机制(上)
  11. [19/06/08-星期六] CSS基础_表格表单
  12. linux操作系统的中断处理,Linux操作系统内核编程中断处理程序解读
  13. 经验分享:vim编辑器的常用命令使用汇总
  14. c语言写32位编译器,MinGW32 GCC编译器 V8.1 32位免费版
  15. mysql中的mysql数据库不见了
  16. 【老九君】【Java】集合框架
  17. 基于李雅普诺夫函数的跟踪控制(一)
  18. OSChina 周二乱弹 ——女孩在身上纹了个四叶草
  19. Android 悬浮窗功能的实现
  20. 协议学习之 vamei博客系列 总结

热门文章

  1. c语言编程 追赶法解方程组,追赶法解线性方程组.doc
  2. linux的常用的安装命令
  3. 雕刻机可以制作PCB
  4. SONY SVP1322 笔记本电脑升级
  5. python调用大漠插件、检测么_python调用大漠插件教程05字库
  6. win10或11非华为电脑安装最新的电脑管家(支持移动应用引擎)安装方法及问题解决
  7. 非华为电脑实现多屏协同、一碰传
  8. 软件安装管家NavisWorks2020中文版软件安装包下载地址及安装教程
  9. 微信小程序跳转外部链接
  10. Visual Studio Code的下载与安装