mongodb自定義字段 MongoDB雜湊分片

2021-10-14 12:16:36 字數 2407 閱讀 1887

雜湊分片使用雜湊索引來在分片集群中對資料進行劃分。雜湊索引計算某乙個欄位的雜湊值作為索引值,這個值被用作片鍵。

雜湊分片以減少定向操作和增加廣播操作作為代價,分片集群內的資料分布更加均衡。在雜湊之後,擁有比較「接近」的片鍵的文件將不太可能會分布在相同的資料庫或者分片上。mongos更有可能執行廣播操作來完成乙個給定的範圍查詢。相對的,mongos可以將等值匹配的查詢直接定位到單個分片上。

注意:

當使用雜湊索引來解析查詢時,mongodb會自動計算雜湊值。應用程式不需要計算雜湊。

警告mongodb雜湊索引在雜湊計算之前會將浮點數截斷為64位整數。例如,雜湊索引會將為具有2.32.22.9的值的字段儲存為相同的值。為了避免衝突,請勿對不能可靠地轉換為64位整數(然後再返回到浮點)的浮點數使用雜湊索引。mongodb雜湊索引不支援大於2^53的浮點值。

如果想檢視乙個鍵的雜湊值是什麼,請參考convertshardkeytohashed()

[1]從4.0版開始,mongo shell提供了convertshardkeytohashed()方法。此方法使用與雜湊索引相同的雜湊函式,可用於檢視鍵的雜湊值。

您選擇作為雜湊片鍵的字段應具有良好的基數或者該欄位包含大量不同的值。雜湊分片非常適合選取具有像objectid值或時間戳那樣單調更改的字段作為片鍵。乙個很好的例子是預設的_id字段,假設它僅包含objectid值(而非使用者自定義的_id)。

要使用雜湊片鍵對集合進行分片,請參閱 對集合進行分片。

給定乙個使用單調遞增的值x作為片鍵的集合,使用範圍分片會導致插入資料的分布類似於下面這樣:

由於x的值始終在增加,因此具有maxkey(上限)的資料塊將接收大多數傳入的寫操作。這將插入操作限制在只能定向到包含此塊的單個分片,從而減少或消除了分片集群中分布式寫入的優勢。

通過在x上使用雜湊索引,插入的分布將類似於下面這樣:

由於現在資料分布更加均勻,因此可以在整個集群中更高效地分布式插入資料。

使用sh.shardcollection()方法,指定集合的完整命名空間以及作為片鍵的目標雜湊索引。

sh.shardcollection( "database.collection",  )
重要

如果您使用雜湊片鍵對乙個已經包含資料的集合進行分片操作:

如果您使用雜湊片鍵對乙個空集合進行分片操作:

初始分配之後,均衡器將管理後續的資料塊分配。

如果已經為空集合或不存在的集合指定區域和區域範圍(從mongodb4.0.3版本起可用):

初始分配之後,均衡器將管理後續的資料塊分配。

另請參考:要了解如何部署分片集群和實現雜湊分片,請參閱部署分片集群。

譯者:劉翔

mongodb中文社群翻譯小組成員

座標深圳的程式猿一枚,後台開發。工作中經常接觸mongodb,請多指教~

往期發布:

the mongo shell

mongodb crud操作

資料模型

事務

索引

安全

—— 配置審計

—— 配置審計過濾器

—— 系統事件審計訊息

複製

分片

管理

儲存

—— wiredtiger儲存引擎

—— 記憶體儲存引擎

喜歡我們,

分享、點讚、在看三連哦~

ChatterBot自定義MongoDB路徑

預設資料庫為slite3,已經不能滿足需求,需改為mongodb class bot def init self self.my bot chatbot mode storage adapter chatterbot.storage.mongodatabaseadapter filters chat...

使用自定義字段

轉儲所有自定義字段作為列表顯示乙個特定自定義欄位的值id,mood true mood 將是自定義欄位的id值 顯示相同自定義欄位id的多個值id,songs false 僅在存在時顯示自定義字段 邏輯 url get post meta post id,snippet reference url ...

自定義MongoDB的ObjectId

mongodb的objectid,由12位組成,其中前四位是乙個unix的時間戳,精確到秒,這樣就產生乙個問題,如果按objectid排序的話,可能得到的順序,和資料插入的順序是有差別的。由此,需要自定義objectid生成器,也是12位組成,只是組成內容有差異,如下 12 8位 時間戳 48位 s...