前言

说起来开始进行面试是11月倒数第二周,上午9点,我还在去公司的公交上,突然收到蚂蚁的面试电话,其实算不上真正的面试。面试官只是和我聊了下他们在做的事情(主要是做双十一这里大促的稳定性保障,偏中间件吧),说的很详细,然后和我沟通了下是否有兴趣,我表示有兴趣,后面就收到正式面试的通知,最后没选择去蚂蚁表示抱歉。

当时我自己也准备出去看看机会,顺便看看自己的实力。当时我其实挺纠结的,一方面现在部门也正需要我,还是可以有一番作为的,另一方面觉得近一年来进步缓慢,没有以前飞速进步的成就感了,而且业务和技术偏于稳定,加上自己也属于那种比较懒散的人,骨子里还是希望能够突破现状,持续在技术上有所精进。

进入正题,先后进行了蚂蚁、拼多多和字节跳动的面试。

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

最后

这份文档从构建一个键值数据库的关键架构入手,不仅带你建立起全局观,还帮你迅速抓住核心主线。除此之外,还会具体讲解数据结构、线程模型、网络框架、持久化、主从同步和切片集群等,帮你搞懂底层原理。相信这对于所有层次的Redis使用者都是一份非常完美的教程了。

快速入手通道:(戳这里,免费下载)诚意满满!!!

整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~

你的支持,我的动力;祝各位前程似锦,offer不断!!!

oc/DSmxTbFJ1cmN1R2dB))诚意满满!!!**

整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~

你的支持,我的动力;祝各位前程似锦,offer不断!!!

挑战华为社招:不止面试题,笔记源码统统都有,最强技术实现相关推荐

  1. 不止面试题,笔记源码统统都有

    前言 其实前几篇文章已经写了好多有关于Spring源码的文章,事实上,很多同学虽然一直在跟着阅读.学习这些Spring的源码教程,但是一直都很迷茫,这些Spring的源码学习,似乎只是为了面试吹逼用, ...

  2. java架构设计图,不止面试题,笔记源码统统都有

    前言: 随着秋招的开启,不管是应届毕业生找工作,还是在职程序员跳槽去找更高薪水的工作,都要面临面试这一难关.应对面试不仅需要丰富的项目经历,还需要牢固的基础知识.在这里整理一些比较详细的Java高频面 ...

  3. 挑战华为社招:2021Java高级面试题汇总解答

    前言 再过一周,马上将迎来新的一年,希望大家在2021年"牛气冲天,牛年大吉",一起迎接春暖花开之时. 金三银四马上就到了,很多粉丝朋友私信希望我出一篇面试专题或者分享面试相关的笔 ...

  4. 挑战华为社招:掌握数据库其实很容易

    前言 我的一个朋友,开发四年了,没跳过槽,四年时间也不过是从最开始的10K涨到了15K,经常和我吐槽工资低.去年8月份左右开始了他"骑驴找马"的行动,从各种地方找学习资料.刷面试题 ...

  5. 挑战华为社招:java开发面试问题大全及答案大全

    基本知识 1.学会分析源码 程序员每天都和代码打交道.经过数年的基础教育和职业培训,大部分程序员都会「写」代码,或者至少会抄代码和改代码.但是,会读代码的并不在多数,会读代码又真正读懂一些大项目的源码 ...

  6. 挑战华为社招:智慧树java程序设计答案

    一.阿里 (会员中台) 1. Java 重写hashcode()是否需要重写equals(),不重写会有什么后果 2. 并发 自旋锁和阻塞锁的区别 公平锁和非公平锁的区别 jdk中哪种数据结构或工具可 ...

  7. 十年辗转4厂,百场校、社招面试后,kotlin源码

    敲黑板!!!没有项目经验就造项目经验!!!! 现在网上那么多的实战教程.github上遍地的源码分享,都可以为你所用.在面试时,这些项目经验都可以写上,最关键的是自己要弄通.弄会,尽量先仿一遍,自己再 ...

  8. 阿里巴巴社招Java面试题做题记录

    阿里巴巴社招Java面试题 1.String和StringBuffer的区别 运行速度和线程安全两方面: 运行速度:StringBuilder >StringBuffer >String ...

  9. 京东2021年5月社招软件测试面试题【有答案】

    京东2021年5月社招软件测试面试题[有答案] 1. http常见状态码有哪些? 2. HTTP协议特点有哪些? 3. 给你一个网站,你如何测试? 4. 一条软件缺陷记录都包含了哪些内容?如何提交高质 ...

  10. C++Primer Plus (第六版)阅读笔记 + 源码分析【目录汇总】

    C++Primer Plus (第六版)阅读笔记 + 源码分析[第一章:预备知识] C++Primer Plus (第六版)阅读笔记 + 源码分析[第二章:开始学习C++] C++Primer Plu ...

最新文章

  1. ionic2.0消息订阅监听机制
  2. perl6之'Hello World'
  3. flex中toolTip汇总
  4. Python第十课 网络管理
  5. Android之Inflate()方法用途+setContentView和inflate区别
  6. 工作流实战_25_flowable 流程中的自动跳过
  7. treeset java_Java TreeSet add()方法与示例
  8. iis configuration error
  9. LOJ.114.K大异或和(线性基)
  10. python合并表格用什么库_python合并多个excel表格数据库-python实现excel合并
  11. java socket 组包_关于socket 分包和组包
  12. Java list 适配器_适配器基类--万能适配器(BaseAdapter)
  13. STM32中大小端转换
  14. [大数据 ]Apache大数据项目目录
  15. 突破考易系统1.0切换窗口封锁
  16. springMVC中ajax使用json 对象 出现 状态代码: 415 Unsupported Media Type
  17. 执行docker命令,出现Cannot connect to the Docker daemon at unix:///var/run/docker.sock.
  18. PRML 2.1 二元变量
  19. 医疗大数据模型:医疗保险欺诈发现大数据模型
  20. 数字化转型与组织产品能力的关系

热门文章

  1. Redis 如何实现库存扣减操作和防止被超卖?(荣耀典藏版)
  2. C语言编译预处理#define(x,y)语句中x*y 、(x)*(y)、(x*y)的问题
  3. VS Code 下载、下载慢、更新(适用于压缩包下载)
  4. 阿里云域名注册与免费证书申请
  5. Java笔记-递归(汉洛塔)
  6. wei gwei ether之间的转换关系
  7. 联想笔记本电脑开机无法修复计算机,联想笔记本开机没反应怎么办 笔记本无法开机的解决方法...
  8. GPS同步时钟(NTP时间服务器)网口物理隔离的好处
  9. 模板文件, ruby erb 与 python format
  10. 部分设计模式案例代码