-
订单记录 需要 分库分表 存储,分库、分表 的 sharding 策略 都是 基于 orderId 进行 计算
-
如果 订单记录 分库分表 的 结果为 x * y(有 x 个库,每个库中有 y 张表),那么 库、表 的 sharding 策略应当为
- 库:orderId % x
- 表:( orderId / x ) % y
1、错误的 sharding 策略
这种 sharding 策略不正确,数据 分摊 不均匀
- 库:orderId % x
- 表:orderId % y
eg1、4 * 4
[0、4、8、12、16、20] 这些数字 模 4,只会余 0
eg2、4 * 6
[0、4、8、12、16、20] 这些数字 模 4,只会余 0、2、4
2、正确的 sharding 策略
【问题】
为什么 [0、4、8、12、16、20] 这些数字 对 4 或 6 取模 所得到的 余数 之间 不是连续的?(导致 不能 连续地、均匀地 分摊在 所有 表中)
【回答】
- 因为 这一串 递增的 数字 之间,step(步长) 为 4,在 模 4 或 6 之后,余数 之间有空隙
- 只有当 step 为 1 时,才能保证:模 任何一个数 之后,余数之间 是 连续的,没有空隙
【解决】
将 [0、4、8、12、16、20] 这些数字 除以 4,使得 step 为 1
- 库:orderId % x
- 表:( orderId / x ) % y
eg1、4 * 4
[0、4、8、12、16、20] 这些数字 整除 4,模 4,会余 0、1、2、3
eg2、4 * 6
[0、4、8、12、16、20] 这些数字 整除 4,模 6,会余 0、1、2、3、4、5