由于业务原因,需要将过期数据删除,但有一个问题出现了,频繁删除数据之后,会产生很多磁盘碎片,这些碎片如果没有被重复利用,
进而会影响查询性能(表查询时仍然会扫描这部分删除数据的磁盘空间块),随需要处理。
当从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. 《手把手教你学C语言》学习笔记(3)---变量

    编程目的是为了解决问题,编程本质是用计算机的思维操作数据,操作就是算法,数据主要是数据类型,也可以说量,其中分为常量和变量,常量主要是指在量的生命周期内无法改变其值:变量主要是指在量的生命周期内可以随 ...

  2. Android build code command

    make bootimage -j8 make systemimage -j8

  3. Selenium2+python自动化1(环境安装)

    前言 目前selenium版本已经升级到3.0了,网上的大部分教程是基于2.0写的,所以在学习前先要弄清楚版本号,这点非常重要.本系列依然以selenium2为基础,目前selenium3坑比较多,暂 ...

  4. LeetCode OJ-- Search a 2D Matrix

    https://oj.leetcode.com/problems/search-a-2d-matrix/ 具有数据递增性质的一个二维数组,对它进行二分搜索. 首先搜索target所在的行,再找列. c ...

  5. Pacman常用命令

    Pacman是Arch Linux 的包管理器.它将一个简单的二进制包格式和易用的构建系统结合了起来.不管软件包是来自官方的 Arch 库还是用户自己创建,Pacman 都能方便得管理. 更新系统 在 ...

  6. Codeforces 762A k-th divisor(数论)

    题目链接:k-th divisor 求出N的第K大因子,满足N <= 10^15,K <= 10^9 直接暴力…… #include <bits/stdc++.h> using ...

  7. Java 字符集,编码、解码

    1. 计算机中文件.数据底层都是基于二进制的. 计算机底层并没有文本文件.图片文件之分,它只是记录着每个文件的二进制序列. 字符集:包含着字符和二进制序列之间的对应关系,一个字符对应一个二进制序列. ...

  8. MFC中 报错:error : bitmap file Res\tankBattle.ico is not in 3.00 format

    今天换了一个ico图标,本来源图像是bmp的,让我改了后缀名成ico. 然后编译就报错了:error : bitmap file Res\tankBattle.ico is not in 3.00 f ...

  9. 转:代码管理技巧——两步创建本地SVN服务器图文教程

    from: http://www.cnblogs.com/tianhonghui/archive/2012/07/22/2603454.html   当我们进行开发的时候,不论是独立开发还是处在团队中 ...

  10. 读刘未鹏老大《你应当怎样学习C++(以及编程)》

    标签(空格分隔): 三省吾身 原文地址:你应当怎样学习C++(以及编程) 本人反思自己这些年在学校学得稀里糊涂半灌水. 看到这篇文章,感觉收获不少.仿佛有指明自己道路的感觉,当然真正困难的还是坚持学习 ...