MongoDB compact 命令详解

为什么需要 compact

mongodb compact 理解

remove和drop的区别

mongodb删除集合有两种方式:

  1. db.connection,remove({});该命令是将集合中的文档按一定条件在btree中逐个删除,但物理空间不会被删除,导致一种删了跟没删一样的错觉;
  2. db.connection.remove({});该命令和上命令的想法一样,但直接删除的是集合里的物理文件,空间会立即回收并释放,remove操作相当于只是把记录删除,而记录所占用的物理空间却没有变动,当有新数据插入时,会优先插入到指定的位置,总大小不变,直到之前remove腾出的空位被占满才会占用新的空间去存放,像经常更新记录的表使用remove操作即可;对于频繁插入而忘记删除的集合,当需要空间去干其他的事情时,就需用到compact操作回收磁盘空间了;

compact对集合的影响

由于本人使用mongodb的时间不长,目前公司的mongodb为主备节点的版本,当在主节点执行
db.connection.runCommand(“compact”);时,会提示“will not run compact on an active replica set primary as this is a slow blocking operation. use force:true to force”,直译的话就是“不会在活动副本集主数据库上紧凑运行,因为这是一个缓慢的阻塞操作。”,以上得知compact操作会导致当前集合所有读写操作阻塞,由于compact的操作耗时与集合中文档的数量直接相关,所有执行该操作时我都是在副本集上执行,等副本操作完成再进行主备节点切换,再执行上述操作,从而完成数据库磁盘回收的目的;

compact底层原理

使用compact操作首先就需要用到mongodb中的存储引擎WiredTiger,WiredTiger在执行compact操作时会将进入的新数据插入到空闲的空间(执行remove操作后空余出来的空间),然后才会将Trancate(锁)文件占用的物理空间回收,每次执行compact操作时,WiredTiger都会检测是否符合运行条件:

  1. 假如集合目前数据大小为80%,当磁盘回收为20%时,他会计算剩余的空间能不能存放当前数据大小的20%,如果不满足,则直接返回OK;

相关文章:

  • 2021-12-17
  • 2022-12-23
  • 2021-09-25
  • 2021-07-09
  • 2021-09-30
  • 2021-05-27
  • 2022-12-23
  • 2021-06-03
猜你喜欢
  • 2021-09-11
  • 2021-07-09
  • 2022-12-23
  • 2021-10-16
  • 2021-07-23
  • 2022-12-23
  • 2021-08-03
相关资源
相似解决方案