MySQL单表2000万数据量是极限?分表阈值的暴力拆解!

92 阅读2分钟

为什么单表2000万时,要考虑分表?从B+树的角度分析

回答

  • 根据经验来说,单表抗 2000万 数据量时,就要考虑分表了。
  • 那他背后的计算逻辑是什么呢?这个数据是如何计算出的呢?
1、 B+ 树的高度限制
  • 对于 B+ 树的高度限制,一般建议将 B+ 树的高度控制在3到4层以内,以获得更快的查询性能。
2、 数据页
3、 估算结果(先看结果)
  • 假设,单条数据是1KB,那么 3 层高度的 B+ 树最终的可存储数据量为:

    1170 * 1170 * 16 = 21,902,400,即2000万!

  • 计算过程,参考:Java 八股//估算

4、估算过程
  1. 首先,B+树的叶子节点和非叶子节点存储的内容是不一样的。所以,要分开计算。

  2. 计算公式

    • 公式一:能存多少条记录 = 叶子节点的数量 * 每个叶子节点中能存的数量
    • 公式二:叶子节点的数量 = 根节点之下的第一层非叶子节点的数量 ^(树高度-1)
  3. 非叶节点的数量

    • 一个根节点的存储量是16KB。他作为非叶子节点,他只需要存储一个主键+一个指针就行了。

    • 假设,一个bigint类型的主键(8字节),和默认6字节的指针。那么可以存储:

      16 * 1024 / (8+6) ≈ 1170

    • 那么,根节点可以扩展出 1170个 二层子节点,

    • 根据 “公式二” ,三层子节点有: 1170 ^ (3-1) = 1,368,900 个叶子节点。

  4. 叶子节点的存储行数

    • 一个叶子节点有16KB。
    • 假设,单行数据量1KB,那么他就能存储16条,
    • 假设,单条数据量500 B, 那么他就能存储32条。
  5. 回去看 “估算结果”