Skip to content

面试速答(先看这里)

**一句话结论:**分成多少,一般是一般是结合订单存量数据,以及增量数据的情况来看要分多少张表。

60秒标准回答:

分成多少,一般是一般是结合订单存量数据,以及增量数据的情况来看要分多少张表。你要知道你存量已经有多少数据量了,以及一年大概增长多少,还要知道业务上希望你的数据保留多久

我给一个公式(如有雷同,纯属抄袭)

分表数量= (订单存量总数 + 预计年增长量 * 保留年限)/2000万 => 向上取最接近的2的幂

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**分表数量= (订单存量总数 + 预计年增长量 * 保留年限)/2000万 => 向上取最接近的2的幂
  • **要点2:**以上公式中的2000万,是Innodb 理论上的单表极限(这里的极限指的是性能不变差的极限)。
  • **要点3:**假设存量数据已经有2000万了,预计每年增长500万,我们需要保留10年,那么就得出:
  • 要点4:(2000 + 500 * 10) / 2000 = 3.5 => 4
  • **要点5:**这里为什么计算出的结果要向上取最接近2的幂呢?

**记忆锚点:**实在是不太好根据并发 → 然后再根据并发 → Innodb → 分库分表中

关键取舍:

  • 我给一个公式(如有雷同,纯属抄袭): 分表数量= (订单存量总数 + 预计年增长量 * 保留年限)/2000万 => 向上取最接近的2的幂 以上公式中的2000万,是Innodb 理论上的单表极限(这里的极限指的是性能不变差的极限)。

易错提醒:

  • 因为这样可以更容易基于分表数量计算分库的数量,以及后期数据迁移的时候更加方便。

加分表达:

  • 库的数量和表的数量之间没有必然联系,但是需要有倍数关系,如果你实在是不太好根据并发去预估库的数量,那么我给你个经验值的公式(如有雷同,纯属抄袭): 分库数量 = 分表数量 / 8 比如我们常用的分库分表数量: 128库,1024张表 64库,512张表 16库,128张表 当然,如果你分表数量本身是小于8的,那要么是2,要么是4,那么我建议你就直接 分库数量…

追问准备:

  • 围绕「实在是不太好根据并发」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「然后再根据并发」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「Innodb」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

分成多少,一般是一般是结合订单存量数据,以及增量数据的情况来看要分多少张表。你要知道你存量已经有多少数据量了,以及一年大概增长多少,还要知道业务上希望你的数据保留多久。

我给一个公式(如有雷同,纯属抄袭):

分表数量= (订单存量总数 + 预计年增长量 * 保留年限)/2000万 => 向上取最接近的2的幂

以上公式中的2000万,是Innodb 理论上的单表极限(这里的极限指的是性能不变差的极限)。

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

打开文档:✅从B+树的角度分析为什么单表2000万要考虑分表??

假设存量数据已经有2000万了,预计每年增长500万,我们需要保留10年,那么就得出:

(2000 + 500 * 10) / 2000 = 3.5 => 4

这里为什么计算出的结果要向上取最接近2的幂呢?

因为这样可以更容易基于分表数量计算分库的数量,以及后期数据迁移的时候更加方便。

📄 ✅分库分表的数量为什么一般选择2的幂?

打开文档:✅分库分表的数量为什么一般选择2的幂?

所以,在做分库分表的时候,可以根据这个公式,大致计算一下需要分多少张表,然后再根据并发的情况,大致算一下需要分多少个库。

库的数量和表的数量之间没有必然联系,但是需要有倍数关系,如果你实在是不太好根据并发去预估库的数量,那么我给你个经验值的公式(如有雷同,纯属抄袭):

分库数量 = 分表数量 / 8

比如我们常用的分库分表数量:

128库,1024张表

64库,512张表

16库,128张表

8库,64张表

当然,如果你分表数量本身是小于8的,那要么是2,要么是4,那么我建议你就直接分库数量=分表数量即可。