首先,我知道这个问题:

Auto compact the deleted space in mongodb?

我的问题不是缩小数据库文件的大小,而是如何重用删除的空间.假设我收集了10万份文档,然后删除其中的5万份.Mongo是否会重用其数据文件中被删除文档释放的空间?或者它们只是被"标记"为已删除?

我不太关心磁盘上文件的实际大小,更多的是关于"它是否在不断增长".

推荐答案

Update (Mar 2015):截至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

Mongodb相关问答推荐

MongoDB MQL,将列表一分为二,仅获取唯一值

Spring数据MongoDB(聚合)

Tableau 与 Mongo DB Atlas by MongoDB 的连接缓存问题

如何从集合中移除所有匹配的数组项?

MongoDB 聚合 - 条件 $lookup 取决于字段是否存在

有谁知道这个错误的修复方法(TypeError: Cannot assign to read only property ‘map’ of object '#')

使用 Node.js 通过 SSL 连接到 MongoDB

如何使用 mongoose 从 MongoDb 获取数据?

哪种 NoSQL DB 最适合 OLTP 金融系统?

无法使用机器 ip 连接到 mongodb

声明多个模式后无法从数据库中获取数据(mongoose + express + mongodb

如何在 mongodb 本机驱动程序中对 find() 进行字段 Select ?

Mongoose 是否真的验证了对象 ID 的存在?

MongoDB $or 查询

Django admin 和 MongoDB,可能吗?

从每个组中 Select 前 N 行

是否有支持 MongoDB 和 Devise 的 Rails 管理界面?

使用 Node.js 将许多记录插入 Mongodb 的正确方法

Mongodb错误:The positional operator did not find the match needed from the query

单个语句中的多个 mongo 更新运算符?