我今天逛了一下CSDN,又发现了一条显眼的数据,大概是说3层B+树足以容纳2000w条数据。我当时就蒙了,3层对2000w,心想这B+树也太厉害了吧,由此勾起了我求知的欲望,我一定要搞明白他这2000w是怎么来的。

重中之重

MySQL的执行流程如下图

在两阶段提交的情况下,是怎么实现崩溃恢复的?

前提:binlog本身不具备crash-safe能力,所以InnoDB考虑到这一点,自己实现了redo log来具备这个能力。

关键点:在写入redo log和binlog时,都会顺便记录当前事务ID

会有如下三种崩溃情况:

1、在写redo log之前崩溃,那么此时redo log和binlog都没有这个ID,是一致的情况,崩溃也没事。

2、在写redo log 的prepare阶段后崩溃,此时redo log有这个ID,会根据ID去binlog查找这个ID,这个时候肯定是没有的,那么就会执行回滚操作。

3、在写binlog后崩溃,那么此时在redo log和binlog都存在这个ID,只是在redo log里的标记是prepare,所以这个时候直接commit就行。

也就是说,在崩溃恢复时,只要redo log不是处于commit阶段,那么就拿着redo log中的这个事务ID去binlog中查找,找得到就提交,找不到就回滚。这样就能确保redo log与binlog的数据一致性。

SQL语句的执行顺序如下图

B+树结构

关于B+树的结构,我在之前的文章有讲过,在这里就不细说了,简而言之,B+树的分支非常多,而且每个非叶子节点只存主键值(主键索引)和指针,数据存在于叶子节点

也就是说,磁盘的IO次数与树的高度是相同的。

3层B+树可以存多少数据?

进入正题,前面说了,3层B+树大概可以存2000w条数据,这个是咋算出来的呢?

在Innodb存储引擎里面,咱们最小存储单元是页,而一个页的大小默认是16KB。

也即代表B+树的每个节点可以存16KB数据,这里我们假设我们的一行数据大小是1K,那么我们一个节点就可以存16行数据。注意:我们真正的数据都是存在叶子节点的,所以这里是指叶子节点可以存放16行数据。

我们前面也说了,非叶子节点存放的是主键值与指针,所以这里假设主键类型为bigint,占用8Byte,指针可以设置为占用6Byte,总共就为14Byte,这样就可以算出一个节点大概可以存放多少个指针了(指针指向下一层节点),大概为16KB/14Byte=1170个

由此,可以推算出,2层B+树的话,可以存放1170*16=18720行数据。3层B+树的话,可以存放1170*1170*16=21902400行数据,也就差不多2000w条数据了。

附加题

为啥不用B树?

因为B树的节点(无论是叶子节点还是非叶子节点),都会保存数据,所以相当于B+树的话,B树的非叶子节点能保存的指针就变少了,保存同等数据量的情况下,B树指针变少了就只能增加树的高度了,就会导致磁盘IO次数变多,从而影响性能

面试官问我为啥B+树一般都不超过3层?3层B+树能存多少数据?redo log与binlog的两阶段提交?相关推荐

  1. 以后面试官问你 为啥不建议使用Select *,请你大声回答他!

    前言 不建议使用 select  *  这几个字眼,做开发的都不陌生吧. 阿里的开发手册上面也是有提到: 昨晚收到一个小兄弟的反馈: (称呼打码了,这是我的隐私,不可能让你们知道的) 随后也问了下学习 ...

  2. 面试官问你为什么离职,HR都认可的离职原因,你学会了吗?

    文章目录 ⭕参考话术 ✅1. 实际离职原因:`上一家公司钱给的太少了` 离职原因可以这样说: ✅2. 实际离职原因:` 跟同事处不来` ✅3. 实际离职原因:`扯皮甩锅大战` 离职原因可以说: ✅4. ...

  3. 【吐血整理】面试官问的那些Java原理你都懂吗

    Spring思维导图 Spring源码学习笔记 有关微服务的面试题: Dubbo中zookeeper做注册中心,如果注册中心集群都挂掉,发布者和订阅者之间还能通信么? Dubbo 的整体架构设计有哪些 ...

  4. MyBatis08:ResultMap 的结果集映射,面试官问的那些Java原理你都懂吗

    1 ResultMap 的结果集映射 1.1 ResultMap 的使用 1.2 多对一的处理 1.2.1 需求 1.2.2 建表 1.2.3 建立实体类 1.2.4 编写对应的 Mapper 接口 ...

  5. 听我讲完redo log、binlog原理,面试官老脸一红

    小伙伴想精准查找自己想看的MySQL文章?喏 → MySQL江湖路 | 专栏目录   我有一个老朋友,我们叫他熊猫.发际线及将触碰到后脑勺,大框金丝眼镜也掩盖不住那黝黑的眼圈,显得格外的"程 ...

  6. 面试官问你B树和B 树,就把这篇文章丢给他

    原文链接:面试官问你B树和B 树,就把这篇文章丢给他 在看这篇文章之前,我们回顾一下前面的几篇关于MySQL的文章,应该对你读下面的文章有所帮助. InnoDB与MyISAM等存储引擎对比 面试官问你 ...

  7. 【154期】面试官问:请你说说 B 树、B+ 树的原理及区别?

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方留言必回,有问必答! 每天 08:35 更新文章,每天进步一点点... 之前在 ...

  8. 面试官问我:什么是高并发下的请求合并?

    作者 | why技术 来源 | why技术(ID:hello_hi_why) 从一道面试题说起 ‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍前段时间一个在深圳的,两年经验的小伙伴出去面试了一圈 ...

  9. 【059期】面试官问:序列化是什么,为什么要序列化,如何实现?

    >>号外:关注"Java精选"公众号,回复"面试资料",免费领取资料!"Java精选面试题"小程序,3000+ 道面试题在线刷, ...

最新文章

  1. [Manthan, Codefest 18][Codeforces 1037E. Trips]
  2. 用aspnetpager实现datalist分页(绝对的简单实用)
  3. c嵌入python类获取返回值
  4. how to write academic english well?
  5. input 的id 和name什么区别
  6. 13_线性回归分析、线性模型、损失函数、最小二乘法之梯度下降、回归性能评估、sklearn回归评估API、线性回归正规方程,梯度下降API、梯度下降 和 正规方程对比
  7. 深入java并发包源码(三)AQS独占方法源码分析
  8. 一文读懂 IPv4 到 IPv6 的过渡技术
  9. Java面试题:2021大厂最全Java面试资料
  10. 取消计算机用户密码页面,取消开机密码 Windows电脑开机登录界面取消方法-电脑教程...
  11. C盘100G不够,如何用D盘(或者E、F)空间给C盘扩容?
  12. 微信分享代码申请key教程
  13. Django创建超级管理员用户步骤
  14. 计算机搜索功能在分区里失灵,DiskGenius搜索已丢失分区(重建分区表)
  15. Typora 0.11.18 beta版不能使用解决方法
  16. 《单片机原理及应用(魏洪磊)》第七章第9题
  17. 达梦数据库SQL查询报错不是 GROUP BY 表达式解决方法
  18. 数据增强方式mosaic(基于yolo4)代码实现python
  19. oracle表自动模拟多条数据,Oracle使用虚拟表dual一次插入多条记录
  20. vb.net操作数据库之ACCESS(1)

热门文章

  1. windows s2019设置JAVA_HOME环境变量
  2. RocketMQ(五)-消费者启动机制、Rebalance机制
  3. Could not find artifact org.aopalliance:com.springsource.org.aopalliance:pom:1.0.0 in central (https
  4. 查看远程计算机的共享,win7怎么查看远程机器共享文件夹
  5. 重庆邮电大学考研计算机科学与技术专业,重庆邮电大学计算机科学与技术研究生专业排名...
  6. r语言读取csv文件encoding乱码问题
  7. java后台 拼接字符串在前端textarea怎么实现换行
  8. Photon OS介绍及网络配置
  9. 语言学校成绩是C,IGCSE考试成绩A*~G区分,igcse多少分是c
  10. 阿里P9李运华:想成为架构师,你必须知道CAP理论