MongoDB 如何選擇與設計一個好的 shard key

如何選擇好的 Shard key

  • 4.2 版本之後,shard key 欄位可以被修改
  • 4.4 版本之後,shard key 可為不存在的欄位,不需要每個文件都有此欄位
  • 5.0 版本之後,可以動態 reshard a collection
  • Shard key 分佈都是一個區間(range),都是 include lower bound, exclude upper bound,例如:
    • 下界: 0
    • 上界: 5
    • 範圍: 0 <= x < 5

High Cardinality

中文叫做高的基數,剛開始也是一知半解。
簡單來說就是該欄位必須範圍夠廣,因為 shard 數量是依照 shard key 進行分配與產生的,最大上限就是 shard key 的範圍。

例如我們選擇 洲(continent) 當作 shard key,那麼 shard 數量不能超過 7 個,因為地球就只有七個大洲。這當然不會是一個好的 shard key。

Frequency

這邊說的是 shard key 欄位的分布狀況,假設用台灣各個城市當作 shard key 就不是很好,因為大部分人會集中在北部,尤其台北市與新北市,這樣 shard 資料量分佈就會很不均衡。

Monotonically Changing

不要選用單純遞增或遞減的欄位作為 shard key,例如日期或者遞增的 sequence number。

因為 shard key 是有上下限的設計,最高為 max,最低為 min。假設選用遞增數字來當 shard key,新的資料進來永遠都會位在 最大的 shard。

若非要使用這種 shard key,可以考慮改用 hashed sharding


最理想的 shard key,除了要滿足上述三個條件外,最好還具備:

  • 最常查詢(的參數),因為是最常使用,且又是參數之一,可以最有效提高查詢。假設查詢條件沒有 shard key,那麼每次查詢都要查遍所有 shard,很浪費。
  • 資料平均,以該 shard key 進行資料分組,期望各個 shard 資料量最平均
  • 作者: MingYi Chou
  • 版權聲明: 轉載不用問,但請註明出處!本網誌均採用 BY-NC-SA 許可協議。