首先,我知道这个问题:
Auto compact the deleted space in mongodb?
我的问题不是关于缩小数据库文件大小,而是关于重用已删除空间的更多信息。假设我在一个集合中有100K文档,然后删除50K这些文档。 Mongo会重用其数据文件中已删除文件已释放的空间吗?或者他们只是“标记”为已删除?
我不太关心磁盘上文件的实际大小,更多的是关于“它是否会增长和增长”。
答案 0 :(得分:20)
更新(2015年3月):截至3.0版本,MongoDB中有多个storage engines。这个答案适用于MMAP存储引擎(仍然是MongoDB 3.0中的默认设置),其他引擎(例如WiredTiger)的答案是完全不同的,可能是可调和可调的。因此,如果您正在使用其他引擎,请阅读该存储引擎的相关文档,以确定您的空间重用默认值和选项。
使用MMAP存储引擎,当删除文档时,留下的空间将被放入空闲列表中。但是,要使用该空间,将需要在稍后插入类似大小的文档,并且MongoDB将需要在特定时间范围内为该文档找到适当的空间(一旦超出查看列表,它将仅附加)否则空间重复使用不会经常发生。此删除是在数据文件中完成的,因此这里没有发生磁盘空间回收 - 所有这些都是在现有数据文件内部完成的。
如果您随后从头开始执行repair或resync a secondary,则会重写数据文件并回收磁盘上的空间(文档上的任何填充也会被删除)。您可以在此处看到磁盘上的实际空间回收。对于任何其他操作(包括compact),磁盘使用情况不会改变,甚至可能会增加。
使用2.2+,您现在可以使用collMod command和usePowersOf2Sizes选项更有可能重复使用已删除的空间(请注意,这是default in 2.6 +)。这意味着文档的初始空间分配效率稍低(例如,对于400字节的文档为512字节),但这意味着当插入新文档时,它更有可能重新使用该空间。如果您要删除(或增长并因此移动)文档,那么从长远来看这将更有效。
对于任何感兴趣的人,编写了大量存储代码的人之一(Mathias Stearn)都有关于存储内部的精彩演示,可以是found here