本站承诺永不接任何虚假欺骗、联盟广告、弹窗广告、病毒广告、诱导充值等影响用户体验的广告,广告屏蔽插件会影响本站部分功能,还请不要屏蔽本站广告,感谢支持!

当前位置:首页 / 正文

2020-08-21 | 编程技术 | 2437 次阅读 | 等你评论 | 0 次点赞 | 繁体

MongoDB3.6 以后,默认使用的储存引擎是 WiredTiger。这个引擎有一个特点,就是删除数据不释放空间。例如现在你的一个集合里面有 10000000 条数据,占用 10GB 的硬盘空间。你把其中的 9999999 条数据都删了,占用空间仍然是 10GB。

如果你想释放空间,最直接的方法是删除整个集合(Drop Collection)或者删除整个数据库(Drop Database)。

如果你的 MongoDB 版本小于 4.4,但是大于等于 3.6,那么虽然删除了数据,磁盘空间不会释放,但当你插入新的数据时,MongoDB
会重用之前占有的空间,而不会继续额外占用新的磁盘空间。

例如你的集合有 10GB,你删除了 9999999 条数据,接下来,在你新插入的数据总大小超过 10GB 前,MongoDB 都不会申请额外的硬盘空间。

我们可以在 Robo 3T 上,通过查看集合的统计信息找到当前集合可重复使用的空间大小。在集合上右键,选择 Statistics,从返回的统计数据中,展开 wiredTiger-block-manager-file bytes available for reuse。这里显示的数据就是当前集合可重用的空间大小。如下图所示。

Alt text

如果你的 MongoDB 允许暂停读写操作,那么还可以在 Robo 3T 或者 Mongo Shell 中使用 compact 命令来释放空间。命令格式为:

db.runCommand({'compact': '集合名'})

在 MongoDB 4.4 之前的版本,compact 会阻塞整个库的增删改查操作,所以需要暂停外部读写后才能执行。

在 MongoDB 4.4 或以后的版本,compact 命令几乎可以在除了删除集合、增删索引外的任何时候执行。

关于 compact 命令的更多说明,可以阅读 compact — MongoDB Manual[1]。

参考资料

[1] compact — MongoDB Manual:
https://docs.mongodb.com/manual/reference/command/compact/#dbcmd.compact

via:
https://mp.weixin.qq.com/s/9PbfaN9zn28LCswY3v86QQ

标签: 数据库数据MongoDB

猜你喜欢
如何定位Mysql中CPU占用高的查询语句
今天 mysql 服务器突然 CPU 告警,记录一下问题查找的过程第一步查看具体是哪个线程占用CPU最高1、在 Linux 中使用 top 命令找到 mysql 进程 PID2、指定进程 PID...
mysql8利用CTE特性实现递归查询
递归查询分为父子查询和子父查询。父子查询: 根据父 id 查询下面所有子节点数据;子父查询: 根据子 id 查询上面所有父节点数据;下边就利用 mysql8 新增语法实现递归查询,表结构及数...
Mysql 窗口函数学习
窗口函数是数据库查询中的一个经典场景,在解决某些特定问题时甚至是必须的。个人认为,在单纯的数据库查询语句层面【即不考虑 DML、SQL 调优、索引等进阶】,窗口函数可看作是考察求职者 SQL 功...
Pycharm 专业版配置自动同步代码至服务器
每次在本机上面写代码,然后传到服务器上面,在服务器上面运行,这样的方式十分繁琐,效率很低,使用下方配置后可实现本地编辑代码保存自动同步到服务器。 # 使用场景 先说说自己的使用场景,我是在什么
Lazysizes.js图片懒加载的使用
**lazysizes **是一种快速(无垃圾),对 SEO 友好且可自动初始化的 lazyloader,用于图像(包括响应图像 picture/ srcset),iframe,脚本/小部件等。它还通
Python3还有哪些未Get的潜藏技能?
在 Python 3 推出后,人们开始逐步将基于 Python 2 的代码迁移至 Python 3 。但在迁移过程中,很多代码都未能使用到 Python 3 提供的新功能。本文作者介绍了相关功能的介绍
(首次提交评论需审核通过才会显示,请勿重复提交)