为什么需要 compact
一图胜千言
remove 与 drop 的区别
MongoDB 里删除一个集合里所有文档,有两种方式
db.collection.remove({}, {multi: true})
,逐个文档从 btree 里删除,最后所有文档被删除,但文件物理空间不会被回收db.collection.drop()
删除集合的物理文件,空间立即被回收
总的来说,remove 会产生逻辑的空闲空间,这些空间能立即用于写入新数据,但文件占用的总物理空间不会立即回收;通常只要持续在写入数据,有物理空间碎片问题并不大,不需要去 compact 集合,有的场景,remove 了大量的数据后,后续的写入可能并不多,这时如果想回收空间,就需要显式的调用 compact。
compact 命令对读写的影响
compact 一个集合,会加集合所在DB的互斥写锁,会导致该DB上所有的读写请求都阻塞;因为 compact 执行的时间可能很长,跟集合的数据量相关,所以强烈建议在业务低峰期执行,避免影响业务。
compact 具体做了什么?
Compact 动作最终由存储引擎 WiredTiger 完成,WiredTiger 在执行 compact 时,