2015-05-07 86 views
1

我們正在首次構建一個使用MongoDB的新系統。我們的主要文檔集合之一包含的文檔可以在幾百字節的大小範圍內,一直到接近16MB的文檔限制。MongoDB文檔的性能是否更改UPDATE取決於文檔大小?

我們需要跟蹤文檔被讀取的次數並限制讀取次數。

我們正在權衡兩種選擇:

  1. 存儲讀取的計數爲正數
  2. 存儲讀取的計數的單獨收集文檔的一部分

第一具有價值,因爲我們可以將計數和數據存入數據庫。

使這個有關的部分是,似乎文檔大小可能會影響寫入性能。但是,我沒有發現任何提及的情況。我們的猜測是,即使我們正在更新單個字段,整個文檔也不得不被反序列化,更新,序列化並寫回表格。如果文件大小差別很大,那麼表現似乎會跟隨。此外,該集合將被編入索引,而MongoDB文檔說每次更新都需要更新集合上的所有索引。這些都會增加潛在的性能問題。

如果是這樣,那麼我們將與第二個選項一起做兩個數據庫命中。

回答

2

如果您使用「原子更新」操作符並且您正在更新的字段大小沒有變化,則可以在不觸及文檔的其餘部分的情況下執行更新。例如,這可以與$inc一起使用。

關於索引,如果您在此處更新的字段上沒有索引,則不需要更新它們。

+0

你知道這個參考文檔嗎? – GaTechThomas

1

爲了解決您的兩個問題,更新文檔不取決於您正在更新的文檔的大小*。因此,如果您有兩個文件:一個文件包含200個字段,重量爲6Mb,另一個包含3個字段,重量爲0.4Kb,您需要更新兩個文件的兩個字段,兩者大致相同。

我在那裏添加了一顆星,因爲如果你正在更新文檔並且文檔變得更大,那麼原始文件有可能是document will be moved(如果沒有足夠的空間來容納新文檔)。在這種情況下,文件的大小會增加一些處罰(你可以用padding來減輕處罰)。正如Thilio所說,原子更新永遠不會導致文檔移動。

關於您的索引問題。索引不取決於文檔大小。這取決於您正在索引的字段數量和字段的大小。例如,對於「非常非常長的文本將會更長」的字段的索引,然後是具有「短文本」的字段。並且數組[1,2,...,500]的索引大小將會比[1,2]更長。