分库分表 中,库、表 的 sharding 策略(取模公式)

  • 订单记录 须要 分库分表 存储,分库、分表 的 sharding 策略 都是 基于 orderId 进行 计算spa

  • 若是 订单记录 分库分表 的 结果为 x * y(有 x 个库,每一个库中有 y 张表),那么 库、表 的 sharding 策略应当为blog

    • 库:orderId % x
    • 表:( orderId / x ) % y

一、错误的 sharding 策略

这种 sharding 策略不正确,数据 分摊 不均匀im

  • 库:orderId % x
  • 表:orderId % y

 

eg一、4 * 4d3

[0、四、八、十二、1六、20] 这些数字 模 4,只会余 0 数据

 

eg二、4 * 6db

[0、四、八、十二、1六、20] 这些数字 模 4,只会余 0、二、4 img

 

 

二、正确的 sharding 策略

【问题】di

为何  [0、四、八、十二、1六、20]  这些数字 对 4 或 6 取模 所获得的 余数 之间 不是连续的?(致使 不能 连续地、均匀地 分摊在 全部 表中)co

【回答】d3

  • 由于 这一串 递增的 数字 之间,step(步长) 为 4,在 模 4 或 6 以后,余数 之间有空隙
  • 只有当 step 为 1 时,才能保证:模 任何一个数 以后,余数之间 是 连续的,没有空隙

【解决】

将  [0、四、八、十二、1六、20]  这些数字 除以 4,使得 step 为 1

  • 库:orderId % x
  • 表:( orderId / x ) % y

 

eg一、4 * 4

[0、四、八、十二、1六、20] 这些数字 整除 4,模 4,会余 0、一、二、3

 

eg二、4 * 6

[0、四、八、十二、1六、20] 这些数字 整除 4,模 6,会余 0、一、二、三、四、5