2012-04-07 64 views
4

我有一個非常大的MongoDB對象,大約2MB。MongoDB和更新就地

我不得不經常更新readCount字段,我需要確保操作非常快。

我知道「更新就地」,我能送這個簡單的操作

db.pages.update({ name:"SamplePage" }, { $inc: { readCount : 1 } }); 

但如何MongoDB的過程,內部操作? 它從磁盤加載所有文檔,修改值並存儲整個文檔,或者,如果文檔大小沒有改變,它能夠在磁盤上只更新相對於readCount值的文件部分?

+0

**它非常簡單** – 2012-04-07 07:07:40

+0

不是,因爲MongoDB使用惰性寫入,或者我不知道如何測量它。 – dash1e 2012-04-07 07:12:35

+0

hmmmm ..試試這個:www.mongodb.org/display/DOCS/getLastError+Command#getLastErrorCommand-{{fsync}} – 2012-04-07 07:17:00

回答

11

MongoDB使用內存映射文件進行數據文件管理。這實際上意味着mongo不會從磁盤加載文檔。相反,它會嘗試訪問該文檔所在的內存頁面。如果這個頁面還沒有在RAM中,那麼操作系統會繼續從磁盤中取出它。

書寫完全一樣。 Mongo嘗試寫入內存頁面。如果它在RAM中,那麼它是超快速的(只是交換內存中的一些位)。該頁面被標記爲髒,操作系統將負責將其刷新到磁盤(保留您的更改)。

如果您啓用了日誌功能,那麼您的插入/更新會更昂貴,因爲mongodb必須再次寫入僅附加文件。

在我的應用程序中,mongodb在適度的硬件上每秒鐘處理10-50k次更新。

+1

10-50K與期刊啓用? – dash1e 2012-04-08 08:50:50

+1

@ dash1e:是的,有日記。 – 2012-04-08 08:52:16

0

MongoDB根據項目生長或移動的頻率計算每個集合的填充因子。更多的時候會生長更大的填充因子。它在內部使用自適應算法來儘量減少更新上的移動。基本上它在RAM中運行。