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

  • 订单记录 需要 分库分表 存储,分库、分表 的 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

转载于:https://my.oschina.net/u/2602893/blog/3007957

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值