2012-11-15 29 views
16

首先,我知道這個問題:MongoDB是否重用已刪除的空間?

Auto compact the deleted space in mongodb?

我的問題是不是雖然縮小DB文件大小,但更多的刪除的空間重用。假設我在一個集合中有100K個文檔,那麼我刪除那些50K的文檔。 Mongo會在其數據文件中重複使用已刪除文檔已釋放的空間嗎?或者他們只是「標記」爲刪除?

我不太關心磁盤上文件的實際大小,它更多地關於「它只是增長和增長」。

回答

20

更新(2015年3月):從3.0版本開始,在MongoDB中有多個可用的storage engines。這個答案適用於MMAP存儲引擎(仍然是MongoDB 3.0中的默認值),對於其他引擎(例如WiredTiger)的答案完全不同,並且可能是可調和可調的。因此,如果您正在使用其他引擎,請閱讀該存儲引擎的相關文檔以確定您的空間重用默認設置和選項。

對於MMAP存儲引擎,當文檔被刪除時,留下的空間被放入一個空閒列表中。然而,要使用這個空間,需要稍後插入類似大小的文檔,並且MongoDB需要在特定的時間範圍內爲該文檔找到適當的空間(一旦超時查看列表,它就會追加),否則空間重用不會經常發生。這種刪除是在數據文件中完成的,因此這裏沒有磁盤空間回收 - 所有這些都是在現有數據文件內部完成的。

如果您隨後從頭開始repairresync a secondary,數據文件將被重寫並且磁盤上的空間將被回收(文檔上的任何填充也會被刪除)。這是您將在磁盤上看到實際空間回收的地方。對於任何其他操作(包括compact),磁盤使用率不會更改,甚至可能會增加。

使用2.2+,您現在可以使用collMod commandusePowersOf2Sizes選項更有可能重新使用已刪除空間(請注意,這是default in 2.6 +)。這意味着文檔的初始空間分配效率稍低(例如對於400字節文檔,512字節),但意味着當插入新文檔時,它更有可能重新使用該空間。如果您正在刪除(或增加並因此移動)很多文件,那麼從長遠來看,這將更有效率。

對於任何人是感興趣的,是寫了很多存儲代碼(Mathias Stearn)之一的人有關於存儲內部有很大的介紹,它可以是found here