为什么单表2000万时,要考虑分表?从B+树的角度分析
回答
- 根据经验来说,单表抗 2000万 数据量时,就要考虑分表了。
- 那他背后的计算逻辑是什么呢?这个数据是如何计算出的呢?
1、 B+ 树的高度限制
- 对于 B+ 树的高度限制,一般建议将 B+ 树的高度控制在3到4层以内,以获得更快的查询性能。
2、 数据页
- Innodb 中的数据页默认大小是16KB。
- 并且,B+树的每个节点都对应着一个数据页,包括根节点、非叶子节点和叶子节点。
- 参考引用:Java 八股/07-MySQL/InnoDB 的数据页 和 B+树 的关系.md
3、 估算结果(先看结果)
-
假设,单条数据是1KB,那么 3 层高度的 B+ 树最终的可存储数据量为:
1170 * 1170 * 16 = 21,902,400,即2000万! -
计算过程,参考:Java 八股//估算
4、估算过程
-
首先,B+树的叶子节点和非叶子节点存储的内容是不一样的。所以,要分开计算。
-
计算公式:
- 公式一:
能存多少条记录 = 叶子节点的数量 * 每个叶子节点中能存的数量。 - 公式二:
叶子节点的数量 = 根节点之下的第一层非叶子节点的数量 ^(树高度-1)
- 公式一:
-
非叶节点的数量
-
一个根节点的存储量是16KB。他作为非叶子节点,他只需要存储一个主键+一个指针就行了。
-
假设,一个bigint类型的主键(8字节),和默认6字节的指针。那么可以存储:
16 * 1024 / (8+6) ≈ 1170
-
那么,根节点可以扩展出 1170个 二层子节点,
-
根据 “公式二” ,三层子节点有:
1170 ^ (3-1)= 1,368,900 个叶子节点。
-
-
叶子节点的存储行数
- 一个叶子节点有16KB。
- 假设,单行数据量1KB,那么他就能存储16条,
- 假设,单条数据量500 B, 那么他就能存储32条。
-
回去看 “估算结果”