先说结论:
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/10Byte≈1600个“主键+指针”的组合。
叶子节点:
在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博客
文章知识点与官方知识档案匹配,可进一步学习相关知识
MySQL入门技能树数据修改插入45926 人正在系统学习中