MongoDB中的參數限制與閥值詳析

這篇文章主要給大家介紹了關於MongoDB中參數限制與閥值的相關資料,文中通過示例代碼以及圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

前言

今天搜索spark mongo的資料,意外發現了MongoDB的一些知識,這些都是之前沒有接觸過的,所以專門記錄下。 (๑• . •๑)

下面話不多說了,來一起看看詳細的介紹吧

一、BSON文檔

  • BSON文檔尺寸:一個document文檔最大尺寸爲16M;大於16M的文檔需要存儲在GridFS中。
  • 文檔內嵌深度:BSON文檔的結構(tree)深度最大爲100。

二、Namespaces

  • collection命名空間:.,最大長度爲120字節。這也限定了database和collection的名字不能太長。
  • 命名空間的個數:對於MMAPV1引擎,個數最大爲大約爲24000個,每個collection以及index都是一個namespace;對於wiredTiger引擎則沒有這個限制。
  • namespace文件的大小:對於MMAPV1引擎而言,默認大小爲16M,可以通過在配置文件中修改。wiredTiger不受此限制。

三、indexes

  • index key:每條索引的key不得超過1024個字節,如果index key的長度超過此值,將會導致write操作失敗。
  • 每個collection中索引的個數不得超過64個。
  • 索引名稱:我們可以爲index設定名稱,最終全名爲..$,最長不得超過128個字節。默認情況下爲filed名稱與index類型的組合,我們可以在創建索引時顯式的指定index名字,參見createIndex()方法。
  • 組合索引最多能包含31個field。

四、Data

  • Capped Collection:如果你在創建“Capped”類型的collection時指定了文檔的最大個數,那麼此個數不能超過2的32次方,如果沒有指定最大個數,則沒有限制。
  • Database Size:MMAPV1引擎而言,每個database不得持有超過16000個數據文件,即單個database的總數據量最大爲32TB,可以通過設置“smallFiles”來限定到8TB。
  • Data Size:對於MMAVPV1引擎而言,單個mongod不能管理超過最大虛擬內存地址空間的數據集,比如linux(64位)下每個mongod實例最多可以維護64T數據。wiredTiger引擎沒有此限制。
  • 每個Database中collection個數:對於MMAPV1引擎而然,每個database所能持有的collections個數取決於namespace文件大小(用來保存namespace)以及每個collection中indexes的個數,最終總尺寸不超過namespace文件的大小(16M)。wiredTiger引擎不受到此限制。

五、Replica Sets

  • 每個replica set中最多支持50個members。
  • replica set中最多可以有7個voting members。(投票者)
  • 如果沒有顯式的指定oplog的尺寸,其最大不會超過50G。

六、Sharded Clusters

  • group聚合函數,在sharding模式下不可用。請使用mapreduce或者aggregate方法。
  • Coverd Queries:即查詢條件中的Fields必須是index的一部分,且返回結果只包含index中的fields;對於sharding集羣,如果query中不包含shard key,索引則無法進行覆蓋。雖然_id不是“shard key”,但是如果查詢條件中只包含_id,且返回的結果中也只需要_id字段值,則可以使用覆蓋查詢,不過這個查詢似乎並沒有什麼意義(除非是檢測此_id的document是否存在)。
  • 對於已經存有數據的collections開啓sharding(原來非sharding),則其最大數據不得超過256G。當collection被sharding之後,那麼它可以存儲任意多的數據。
  • 對於sharded collection,update、remove對單條數據操作(操作選項爲multi:false或者justOne),必須指定shard key或者_id字段;否則將會拋出error。
  • 唯一索引:shards之間不支持唯一索引,除非這個“shard key”是唯一索引的最左前綴。比如collection的shard key爲{“zipcode”:1,”name”: 1},如果你想對collection創建唯一索引,那麼唯一索引必須將zipcode和name作爲索引的最左前綴,比如:collection.createIndex({“zipcode”:1,”name”:1,”company”:1},{unique:true})。
  • 在chunk遷移時允許的最大文檔個數:如果一個chunk中documents的個數超過250000(默認chunk大小爲64M)時,或者document個數大於 1.3 *(chunk最大尺寸(有配置參數決定)/ document平均尺寸),此chunk將無法被“move”(無論是balancer還是人工干預),必須等待split之後才能被move。

七、shard key

  • shard key的長度不得超過512個字節。
  • “shard key索引”可以爲基於shard key的正序索引,或者以shard key開頭的組合索引。shard key索引不能是multikey索引(基於數組的索引)、text索引或者geo索引。
  • Shard key是不可變的,無論何時都不能修改document中的shard key值。如果需要變更shard key,則需要手動清洗數據,即全量dump原始數據,然後修改並保存在新的collection中。
  • 單調遞增(遞減)的shard key會限制insert的吞吐量;如果_id是shard key,需要知道_id是ObjectId()生成,它也是自增值。對於單調遞增的shard key,collection上的所有insert操作都會在一個shard節點上進行,那麼此shard將會承載cluster的全部insert操作,因爲單個shard節點的資源有限,因此整個cluster的insert量會因此受限。如果cluster主要是read、update操作,將不會有這方面的限制。爲了避免這個問題,可以考慮使用“hashed shard key”或者選擇一個非單調遞增key作爲shard key。(rang shard key 和hashed shard key各有優缺點,需要根據query的情況而定)。

八、Operations

  • 如果mongodb不能使用索引排序來獲取documents,那麼參與排序的documents尺寸需要小於32M。
  • Aggregation Pileline操作。Pipeline stages限制在100M內存,如果stage超過此限制將會發生錯誤,爲了能處理較大的數據集,請開啓“allowDiskUse”選項,即允許pipeline stages將額外的數據寫入臨時文件。

九、命名規則

  • database的命名區分大小寫。
  • database名稱中不要包含:/ .‘'$*<>:|?
  • database名稱長度不能超過64個字符。
  • collection名稱可以以“_”或者字母字符開頭,但是不能包含”$”符號,不能爲空字符或者null,不能以“system.”開頭,因爲這是系統保留字。
  • document字段名不能包含“.”或者null,且不能以“$”開頭,因爲$是一個“引用符號”。

最後記錄下json嵌套中含有列表的查詢方法,樣例數據:

{
 "_id" : ObjectId("5c6cc376a589c200018f7312"),
 "id" : "9472",
 "data" : {
 "name" : "測試",
 "publish_date" : "2009-05-15",
 "authors" : [ 
  {
  "author_id" : 3053,
  "author_name" : "測試數據"
  }
 ],
 }
}

我要查詢authors中的author_id,query可以這樣寫:

db.getCollection().find({'data.authors.0.author_id': 3053})

用0來代表第一個索引,點代表嵌套結構。但是spark mongo中是不能這樣導入的,需要使用別的方法。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對神馬文庫的支持。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章