分庫分表 中,庫、表 的 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

相關文章
相關標籤/搜索