由于业务原因,需要将过期数据删除,但有一个问题出现了,频繁删除数据之后,会产生很多磁盘碎片,这些碎片如果没有被重复利用,
进而会影响查询性能(表查询时仍然会扫描这部分删除数据的磁盘空间块),随需要处理。
当从MongoDB中删除文档(Documents)或集合(Collections)后,MongoDB不会将Disk空间释放给OS,MongoDB在数据文件(Data Files)中维护Empty Records的列表。
当重新插入数据后,MongoDB从Empty Records列表中分配存储空间给新的Document,因此,不需要重新开辟空间。为了更新有效的重用Disk空间,必须重新整理数据碎片。
有好几种方法处理:
①使用compact命令
②重建collection
③节点降级,主变成从,从变成主,删数据,再数据同步(数据量非常大的情况下,建议晚上操作同步数据)
 
comoact命令可以压缩单个集合和它的索引。以前压缩数据库的唯一办法就是执行这个数据库的repair

具体用法:
>use testdb
> db.myCollection.runCommand('compact');
> db.runCommand({ compact : 'myCollection' });
压缩比率截图:


压缩比率=348160/1044480*100%=33%

compact优点:
1.compact只压缩需要的Collection,压缩期间产生的临时文件会就相对较少,对磁盘剩余空间需求较小;

2.compact去除Collection所在文件的碎片,其重建索引的cost也变小了,对内存的需求也减少;

compact注意点:
1.compact操作是不会释放磁盘空间的,而是把释放的空间继续给MongoDB使用;
2.compact操作进行时会产生对应的锁,使用mongostat可以查看,所以该操作最好在业务量最少下进行;
3.限制集合{Capped Collection}是不需要compact的

官方解释是:compact命令能够重写和重组集合的data和index
     格式:      
    db.runCommand({ compact: <collection name>,force:<boolen> } )   ---红色部分是可选项
     compact命令之后写你想要整理的collection名字
     force参数用于replica set中primary整理时之用,否则会报错
说明:
          在compact期间会阻塞其他针对此collection的操作,所以最好在业务不繁忙的时候进行compact动作;
          针对compact完成之后,不同引擎会有不同的磁盘影响
     WireTiger引擎:
          在此引擎的数据库下,compact会整理碎片,并且释放未使用的磁盘空间给系统
     MMAPv1引擎:
          在此引擎的数据库下,compact会整理碎片,重建索引,但不会将未使用的空间释放给系统,后续新插入的数据依然可以使用这些空间
     在复制集架构下的一些注意:
          compact命令不会自动复制到secondary节点执行,compact在每个节点成员中都是独立的,在Primary,secondary中执行时都要使用force参数,
          当在secondary的collection上执行compact命令时,此secondary节点会变成RECOVERING状态,且无法提供读操作
     在capped collection中不必使用compact命令,因为它本身就是固定空间
 
 

mongo的碎片整理的更多相关文章

  1. 关闭电脑SSD的磁盘碎片整理

    小白往往会把机械硬盘时代的习惯带进固态硬盘时代,比如碎片整理.机械硬盘时代砖家最喜欢告诉小白:“系统慢了吧?赶紧碎片整理撒.”小白屁颠屁颠地整理去了.殊不知碎片整理对于SSD来说完全就是种折磨.这种“ ...

  2. sql索引碎片产生的原理 解决碎片的办法(sql碎片整理)(转)

    本文讲述了SQL SERVER中碎片产生的原理,内部碎片和外部碎片的概念.以及解决碎片的办法和填充因子.在数据库中,往往每一个对于某一方面性能增加的功能也会伴随着另一方面性能的减弱.系统的学习数据库知 ...

  3. 转载:为什么Linux不需要磁盘碎片整理

    转载自:www.aqee.net 如果你是个Linux用户,你可能听说过不需要去对你的linux文件系统进行磁盘碎片整理.也许你注意到了,在Liunx安装发布包里没有磁盘碎片整理的工具.为什么会这样? ...

  4. 为什么Linux不需要碎片整理?

    如果你是一个 Linux 用户,你可能会听说 Linux 的文件系统不需要碎片整理.你也可能会注意到 Linux 的发行版本也都没有磁盘碎片整理的功能.这是为什么呢? 要理解为什么 Linux 的文件 ...

  5. UltimateDefrag磁盘碎片整理软件 v3.0.100.19汉化版

    软件名称:UltimateDefrag磁盘碎片整理软件 v3.0.100.19汉化版软件类别:汉化软件运行环境:Windows软件语言:简体中文授权方式:免费版软件大小:3.25 MB软件等级:整理时 ...

  6. Defraggler磁盘碎片整理工具,让你的电脑读写速度更快

    相信大家都听说过磁盘碎片整理吧,所谓磁盘碎片,通俗的来说,就是指计算机中的各种文件最开始在磁盘中存储的时候地址都是连在一起的,但是随着文件 的多次读写,或者说多次的移动复制等操作,这些文件在磁盘中的地 ...

  7. Virtual box中Ubuntu虚拟机磁盘碎片整理和空间清理方法

    虚拟机中,随着不断的使用,增加大文件(例如日志,视频和软件版本),虽然在虚拟机中手动删除了,但是虚拟机占用的空间并不会随之减少,需要手动清理一下. 这里介绍一种Virtual box中Ubuntu碎片 ...

  8. SQL Server索引碎片整理实际操作记录

    SQL Server 版本是 2008 R2. 查询数据库索引碎片情况的 SQL 语句(来源): SELECT OBJECT_NAME(ind.OBJECT_ID) AS TableName, ind ...

  9. Oracle表空间碎片整理SHRINK与MOVE

    整理表碎片通常的方法是move表,当然move是不能在线进行的,而且move后相应的索引也会失效,oracle针对上述不足,在10g时加入了shrink,那这个方法能不能在生产中使用呢?        ...

随机推荐

  1. Serializable在C#中的作用及其优点

    原文发布时间为:2009-10-27 -- 来源于本人的百度文章 [由搬家工具导入] Serializalbe - Enable the object can be Serialized into a ...

  2. DataBinder.Eval值的判断

    原文发布时间为:2009-04-10 -- 来源于本人的百度文章 [由搬家工具导入] 问:如何对<%# DataBinder.Eval(Container.DataItem,"Ly_R ...

  3. vmware tools安装过程

    每次通过vmware安装Ubuntu的时候,总是会多多少少出点问题.好容易披荆斩棘把镜像安好了,然而屏幕却只有小小一个,不能显示大屏,我就知道肯定是缺少了vmware tools.于是点击左上方菜单中 ...

  4. springBoot api接口

    application/json 请求接口 @RequestMapping(value = "/getBaseData", method = RequestMethod.POST, ...

  5. Cryptography I 学习笔记 --- 使用分组密码

    1. 如果加密算法是确定性的(相同的明文产生相同的密文),那么它对于选择明文攻击是不安全的 2. 随机化加密,每次对相同的密文加密,会产生不同的结果 AES加密模式 ecb:明文分块计算,块与块之间没 ...

  6. (9)JavaScript-DOM(文档对象模型)

    DOM是针对 HTML 和 XML 文档的一个 API ,描绘了一个层次化的节点树,允许开发人员添加.移除和修改页面的某一部分  一.节点层次 <html> <head> &l ...

  7. 从壹开始 [ Ids4实战 ] 之四 ║ 用户数据管理 & 前后端授权联调

    前言 哈喽~~~ 大家周一好!夏天到了,大家舒服了没有,熟话说,打败你的不是天真,是天真热!

  8. Zabbix4.0安装与入门及常见配置

    1.安装zabbix-server 环境: 10.0.0.50 zabbix-server 10.0.0.51 zabbix-web 10.0.0.52 zabbix-agent yum -y ins ...

  9. Hdoj 2509 Be the Winner

    Diciption Let's consider m apples divided into n groups. Each group contains no more than 100 apples ...

  10. AMD 的 CommonJS wrapping

    其实本文的标题应该是「为什么我不推荐使用 AMD 的 Simplified CommonJS wrapping」,但太长了不好看,为了美观我只能砍掉一截. 它是什么? 为了复用已有的 CommonJS ...