2010-05-11 134 views
29

我即將採用MongoDB進行一個新項目,我選擇它來獲得靈活性,而不是可擴展性,因此將在一臺機器上運行它。從文檔和Web帖子我不斷閱讀,所有索引都在RAM中。這對我來說沒有意義,因爲我的索引很容易大於可用RAM的數量。MongoDB索引/內存關係

任何人都可以分享索引/ RAM關係的一些見解,以及當單個索引和所有索引都超過可用RAM的大小時會發生什麼?

回答

28

MongoDB保持它在RAM中的索引。它們將以LRU爲基礎進行交換。您經常會看到一些文檔,建議您將「工作集」保留在內存中:如果您實際訪問的索引部分適合內存,則無問題。

+2

好簡單明瞭的解釋準確地計算出'工作set',讓我們說我有一個單一的集合。然後,運行'db.collection.stats()'。 'filesize'或'datasize'表示我的「工作集?」 – 2013-10-09 18:26:37

8

這是工作集大小加上MongoDB的索引,理想情況下應該駐留在RAM中,即可用RAM的數量理想情況下應該至少是工作集大小加上索引大小加上剩下的OS(操作系統)和運行在同一臺機器上的其他軟件的需求。如果可用RAM小於此值,LRU就會發生什麼情況,因此我們可能會顯着減速。 需要記住的一件事是,在一個索引中,btree桶被緩存,而不是單個索引鍵,即如果我們在包括歷史數據的索引中有一個統一的鍵分佈,我們可能需要更多的RAM索引。我們有一個時間複合指數加上別的東西。對於後者,同一個btree桶中的鍵通常來自同一個時代,所以這個警告不會發生。 另外,我們應該記住,我們在BSON中的字段名稱存儲在記錄中(但不是索引),所以如果我們處於內存壓力下,他們應該保持簡短。

那些對MongoDB的當前虛擬內存使用感興趣的人(當然也是關於內存),可以看看mongod的狀態。

@see http://www.markus-gattol.name/ws/mongodb.html#sec7