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