我读过一篇来自 Parse [1] 的文章,您可以运行它compact
来保存 MongoDB 上的索引大小。
我们的总索引大小为 10GB,总内存为 12GB,您可能知道当索引大小接近内存大小时,MongoDB 的性能会很差,因此我们尝试运行compact
并将大小减少到 7GB。
然而,一周后,大小又增长回 10GB,因此目前我们有一个计划作业来运行这些compact
命令。
我在想这是否真的有帮助,以及为什么索引增长得如此之快并且在达到 10GB 时就稳定下来?
答案1
Parse 有一个独特的问题——他们不知道人们如何使用他们提供的 MongoDB。大多数依赖 Parse 作为管理 MongoDB 用例的人主要会阅读有关 Parse 如何尝试解决其客户使用不当的问题。
话虽如此,您不应该总是进行压缩。事实上,如果您必须定期进行压缩,则意味着您使用 MongoDB 的效率低下。MongoDB 可能“碎片整理”的原因如下:
- 定期删除文档
- 不断更新文档并使文档变大(不包括原子更新)
如果您定期删除文档,那么您应该考虑使用 TTL 或上限集合。
如果您正在更新文档并使文档变得更大(即不断扩展数组),那么您应该考虑重新设计架构以限制文档的无限增长。或者,您可以考虑添加填充作为未来更新的占位符。
无论如何,如果您必须定期且频繁地进行压缩,则表明您未正确使用 MongoDB,您应该考虑重新设计您的架构。压缩会阻塞命令,并且对于大于几 GB 的数据大小,可能需要一段时间才能完成。