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

总结

蚂蚁面试比较重视基础,所以Java那些基本功一定要扎实。蚂蚁的工作环境还是挺赞的,因为我面的是稳定性保障部门,还有许多单独的小组,什么三年1班,很有青春的感觉。面试官基本水平都比较高,基本都P7以上,除了基础还问了不少架构设计方面的问题,收获还是挺大的。

资料领取方式:戳这里


经历这次面试我还通过一些渠道发现了需要大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

主要有**:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

Java开发知识点!mysql运行sql文件很慢相关推荐

  1. Navicat for mysql 运行.sql 文件时 出现的错误

    问题1. 不是insert语句有问题,也不是create创建有问题,而是时间类型有问题,无论是datetime还是time,Navicat for mysql 工具转储数据表的结构,时间后面都会带&q ...

  2. mysql运行sql文件出错

    从服务器上转储数据库到本地,使用的工具是Navicat for mysql.选中数据库,点击右键,选择转储SQL文件. 但是在新建数据库,将转储的SQL文件导入本地数据库,本地运行SQL文件时一直报错 ...

  3. mysql运行.sql文件报错问题汇总--持续更新

    1.[ERR] 1273 - Unknown collation: 'utf8mb4_0900_ai_ci' 报错原因: 生成转储文件的数据库版本为8.0,要导入sql文件的数据库版本为5.6,因为是 ...

  4. linux mysql 运行sql文件命令大全_linux下执行mysql的sql文件

    linux下执行mysql的sql文件 mysql -uroot -proot 进入到mysql 然后执行source /var/ftp/pub/sogoodsoft.sql; 即可. www.2ct ...

  5. 阿里云 Ubuntu上的mysql运行sql文件来创建表

    1.上传sql文件到指定目录 2.登录数据库 mysql -u root -p 3.查看数据库 show databases; 4.创建数据库 create database wlh; 5.对新创建的 ...

  6. Mac mysql 运行sql文件中文乱码的问题

    别再傻傻的改什么mysql的编码格式了. 是.sql文件的编码有问题,把sql文件的编码格式改成utf-8就行了. mac怎么修改呢? vscode最爽了. 用vscode打开.sql文件,然后点右下 ...

  7. mysql运行sql文件不成功,圆我大厂梦!

    咱先来聊聊Redis 像Redis的基础入门,掌握下图这几个列出来的知识点足以了. 进阶的话,就得下点功夫了,事务.主从复制.哨兵.集群等等之类的搞不明白你就上不去呀. 再看美团亿级流量Redis实战 ...

  8. mysql 运行sql 编码_关于解决运行 sql 文件时, 找不到 MySQL 默认编码 utf8mb4 的问题...

    关于解决运行 sql 文件时, 找不到 MySQL 默认编码 utf8mb4 的问题 本人小白一名, 最近碰到了一个问题, 在 navicat 导入 MySQL 文件时, 报出 MySQL 找不到 u ...

  9. 关于解决运行sql文件时,找不到MySQL默认编码utf8mb4的问题

    关于解决运行sql文件时,找不到MySQL默认编码utf8mb4的问题 参考文章: (1)关于解决运行sql文件时,找不到MySQL默认编码utf8mb4的问题 (2)https://www.cnbl ...

最新文章

  1. 使用nat技术实现tcp负载均衡
  2. Server2012Web方式修改用户名密码
  3. findbugs插件_提升编码效率的IntelliJ IDEA必备插件
  4. 9个元素换6次达到排序序列_程序员必须掌握的:10大排序算法梳理已整理好
  5. PHP require和include的区别
  6. ajax php 动态,jQuery+PHP+Ajax实现动态数字统计展示功能
  7. camel.js_Camel 2.11 –具有URL重写功能的HTTP代理路由
  8. echarts vue 柱状图实例_VUE中使用Echarts绘制柱状图
  9. ComponentName知识
  10. mybatis可以生成不重复的id吗_Mybatis面试题吐血总结
  11. 【linux】ssh 远程执行命令
  12. hdu6086(AC 自动机)
  13. 0基础学python做什么工作好-零基础自学Python多久可以找工作?
  14. 数据结构上机实践第四周项目4 - 建设双链表算法库
  15. 石油大学计算机课程,2018年石油高校计算机类课程MOOC共建研讨会在我校召开
  16. 许晓斌_Maven实战(八)——常用Maven插件介绍(下)
  17. 曲线积分于曲面积分(后篇 曲面积分-坐标曲面积分-高斯公式-斯托克斯公式)
  18. photoshop去眼袋
  19. 【论文】caj文件打开方式
  20. C语言中static变量详解

热门文章

  1. 二阶偏导相等的一个充分条件
  2. 隐藏Ubuntu 18.04 顶部通知栏( hide top bar)
  3. 超美二次元响应引导页源码
  4. 微信小程序一键置顶操作详解:
  5. 计算机利用公式计算实发工资怎么弄,如何在excel 表中 添加税收计算程序?excle中计算税收的公式...
  6. 单条视频播放超7000万,网红界“大油田”如何掀起快手流量浪潮?
  7. 【C++小游戏】推箱子代码+详解
  8. Spring boot 中使用 Thymeleaf
  9. mac OS下的资源限制 以及 引出的ulimit, launchctl, sysctl区别
  10. php微信调用天气api,微信公众号接口开发--snoweek测试