MongoDB是否重用已删除的空间?

时间:2012-11-15 01:15:15

标签: mongodb

首先,我知道这个问题:

Auto compact the deleted space in mongodb?

我的问题不是关于缩小数据库文件大小,而是关于重用已删除空间的更多信息。假设我在一个集合中有100K文档,然后删除50K这些文档。 Mongo会重用其数据文件中已删除文件已释放的空间吗?或者他们只是“标记”为已删除?

我不太关心磁盘上文件的实际大小,更多的是关于“它是否会增长和增长”。

1 个答案:

答案 0 :(得分: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