在回答这个问题之前,先了解一下 MySQL InnoDB 存储引擎是如何回收磁盘空间的。
假设有一张表包含 1000 万条记录,删除其中的 800 万条记录,此时 InnoDB 的磁盘空间不会自动释放。要回收磁盘空间,需要执行以下命令:
MongoDB 的 WiredTiger 存储引擎也有类似的行为。要回收磁盘空间,可以执行以下命令:
下面通过一个测试用例来实际演示这一过程。
首先,插入 100 万条随机生日数据到 MongoDB 的 demo
集合中。
接下来,删除所有生日在 1980 年 1 月 1 日之前的记录。
删除操作后,检查 demo
集合可以回收的磁盘空间(单位:字节)。
最后,执行磁盘空间回收操作。
需要注意的是,在 MongoDB 4.4 版本之前,compact
操作会阻塞 CRUD 操作。而在 MongoDB 4.4 及更新的版本中,compact
操作不会阻塞 CRUD 操作,但会阻塞元数据操作,例如删除集合、删除索引和创建新索引。
最后附上统计库里每个集合可回收的空间(GB)脚本
参考文献: https://www.percona.com/blog/using-compact-in-percona-server-for-mongodb-from-version-4-4/
https://www.percona.com/blog/how-to-reclaim-disk-space-in-percona-server-for-mongodb/