当前位置: 首页 > news >正文

MySQL InnoDB引擎——三层B+树可以存储多少数据量

先说结论:

3层B+树大概可以存:

  • 主键为bigint:约2000w
  • 主键为int:约4000w

*备注:

《阿里开发手册》中建议,单表行数超过500万行或者单表容量超过2GB,才推荐进行分库分表,如果预计三年后数据量根本达不到这个级别,就不必要在创建表时就分库分表。 

计算

在Innodb存储引擎里面,最小存储单元是页,而一个页的大小默认是16KB。 一个节点(叶子节点或非叶子节点)的大小就是一页。

在MySQL Innodb存储引擎中的B+树的一个节点大小为“1页”,也就是16k也即代表B+树的每个节点可以存16KB数据。

为什么设计成这个大小?解释一下:

之所以设置为一页,是因为对于大部分业务,一页就足够了。
一条数据必须是放在一个节点中,不能拆开到多个节点存储。而一般一条数据大概1KByte,那么一页能容纳的大概16条,即一个节点容纳不止一条数据,而且是多达16条!!所以大小采用最小存储单元足够用了~

非叶子节点:
ps:指针是用来指向下一个“节点”的。

  • 假设主键类型为bigint,占用8Byte,指针可以设置为占用6Byte,总共14Byte。这样就可以算出一个非叶子节点大概可以存放16KByte/14Byte=1170个“主键+指针”的组合
  • 假设主键类型为int,占用4Byte,指针可以设置为占用6Byte,总共10Byte。这样就可以算出一个非叶子节点大概可以存放16KByte/10Byte1600个“主键+指针”的组合

叶子节点:

在B+树中,真正的数据是只存储在叶子节点中的。
这里我们假设我们的一行数据大小是1K,那么我们一个叶子节点就可以存16KByte/10Byte=16条(行)数据

由此,可以推算出公式:

  • 两层总数 = 非叶子节点(根) 叶子节点。
  • 三层总数 = 非叶子节点(根) * 非叶子节点 * 叶子节点。

主键为bigint(约2000w)

  • 2层B+树的话:可以存放1170个*16条=18720条(行)数据。
  • 3层B+树的话:可以存放1170个*1170个*16条=21902400条(行)数据。

主键为int(约4000w)

  • 2层B+树的话:可以存放1600个*16条=25600条(行)数据。
  • 3层B+树的话:可以存放1600个*1600个*16条=40960000条(行)数据。

所以三层B+树也就差不多2000w条或4000w条数据。


参考:面试官问我为啥B+树一般都不超过3层?3层B+树能存多少数据?redo log与binlog的两阶段提交?_3层b+树能存储多少数据_不平衡的叉叉树的博客-CSDN博客 

http://www.lryc.cn/news/18259.html

相关文章:

  • 部署跨云容灾的五大难点
  • Docker Compose
  • 【ARM架构】armv8 系统安全概述
  • 数学小课堂:数学边界
  • 检测中断到来时,让LED灯状态取反,并且在串口工具上打印一句话
  • 2023年CDGA考试-第7章-数据安全(含答案)
  • 输出月份英文名称--C语言实现
  • 6年测试经验老鸟:做不好自动化测试,还谈什么高薪?
  • Java Web:开篇综述与第一章
  • ES6中对象的一些拓展
  • 10分钟快速入门Pandas库
  • 考研复试机试 | C++ | 王道机试课程笔记
  • 【python科目一:生产线系统设计;激光刀切割材料】
  • Linux——进程概念(进程状态)
  • 超详细:正则表达式从入门到入门
  • jupyter notebook小技巧
  • 考研复试机试 | c++ | 王道复试班
  • js闭包简单理解
  • 「JVM 编译优化」编译器优化技术
  • 回溯问题(子集型回溯、组合型回溯、排列型回溯)【零神基础精讲】
  • 源代码配置安装Apache
  • css水平垂直居中各种方法实现方式
  • PowerShell Install java 13
  • Python的PyQt框架的使用(汇总)
  • 力扣热题100Day05:15.三数之和,17. 电话号码的字母组合,19. 删除链表的倒数第 N 个结点
  • 探索开源:获取完整的 GitHub 社区数据集
  • github ssh密钥配置,克隆远程仓库
  • 突破年薪百万难关!吃透这套Java真题合集
  • [黑马程序员SSM框架教程] Spring-11-setter注入
  • Java多线程(一)--多线程基础知识