MongoDB 空间碎片整理除了db.repaireDatabase()还有其他效率更高的方式吗?


  • 註冊用戶

    MongoDB 如果数据修改很频繁,空间碎片问题会变严重,具体症状表现在查询效率降低,内存不够用,索引命中率低,磁盘文件扩张与实际数据量不相符等。但是利用db.repaireDatabase()来整理碎片又非常的慢,请问还有其他效率更高的方式吗?


  • 大中华区MongoDB顾问

    通常情况下其实并不需要整理碎片,系统会重复利用已有的空间。目前没有得到很多报告因为碎片导致效率降低的情况,你的问题可能有其他原因。

    实在要做的情况下复制集可以让结点逐个重新做同步,就达到了整理的目的。这是推荐的影响最小的方式。

    除此之外3.2.3之后的版本也可以使用`compact`命令来整理。


  • 註冊用戶

    之前很多人都有提到這個問題,所以意思是 db.repaireDatabase() 對執行效率的提升並沒有幫助嗎?


  • Lv 1

    @zhangyaoxing

    [compact — MongoDB Manual 3.4](https://docs.mongodb.com/manual/reference/command/compact/)

    WiredTiger

    On WiredTiger, compact will rewrite the collection and indexes to minimize disk space by releasing unused disk space to the system. This is useful if you have removed a large amount of data from the collection, and do not plan to replace it.

    所以 compact 對釋放空間應該還蠻不錯... 下次來試一下單機效果


  • 大中华区MongoDB顾问

    @yea @jesseshi 可以想象一下windows的磁盘碎片整理,compact做的基本上是同样的事情。虽然它的效率比repairDatabase要好,但是不要期望它有多么好的表现。毕竟整理磁盘就是要大规模地移动文件内容,无论如何都会消耗掉大量的I/O资源。所以如果是在线做,多少一定会影响到线上服务。一定要做的话,建议用类似rolling upgrade的方式在从结点上一个一个做。无论是repairDatabase还是compact,它们都可以让数据在磁盘上的排列更加紧凑,但要说对性能有什么帮助,我认为除了释放磁盘空间外没有太大的作用。因为排列紧凑的资料只有在readahead有效的时候可能带来更多的好处。但由于WiredTiger本身的MVCC (Multi Verion Concurrent Control)设计,我们一般推荐

    本帖下載内容已隐藏,请登入以查看隐藏内容!
    ,因为它通常都不能对性能提供太大的帮助(除非系统只有insert/read没有update/delete,比如capped collection)。所以无论数据是否连续存放,对性能上的帮助不大。


  • 註冊用戶

    @zhangyaoxing

    所以結論是並不需要特地做空間碎片整理,感謝回覆~


  • 大中华区MongoDB顾问

    顺便,你们提到的长时间运行后速度变慢的问题我觉得可能跟碎片没什么关系,倒是很可能跟缺少索引有关系。

    当查询命中索引时其时间复杂度为O(log n),如果不能命中索引则为O(n)。后者随记录数量的增长成正比增长,符合你们提到的现象。可以从这方面下手检查。


登录后回复
 

与 萌阔论坛 的连接断开,我们正在尝试重连,请耐心等待