在WiredTiger中对MongoDb文档执行部分更新是否比完整文档更新提供了任何优势?

时间:2015-06-17 04:57:16

标签: mongodb wiredtiger

我使用Java驱动程序虽然这个问题不是特定于语言的,但是为了对mongodb文档进行部分更新,因为使用MMAPv1存储引擎可以在适当的位置编辑文档(在内存中),这样可以提供更好的性能。 这确实增加了相当大的开发复杂性,因为我可以立即保存整个文档,而不用担心确切更新的细节。在更新到WiredTiger之后,我了解到这个较新的存储引擎不会编辑文档(在内存中),而是为每次写入分配新的内存(不清楚这是否意味着文档的完整副本或只是差异)。这是否意味着无论是完整文档写入还是部分文档写入都没有性能差异?

1 个答案:

答案 0 :(得分:3)

  

更新到WiredTiger后,我了解到这个较新的存储引擎不会编辑文档(在内存中),而是为每次写入分配新内存(不清楚这是否意味着文档的完整副本或只是差异)。

WiredTiger使用Multiversion Concurrency Control (MVCC)在读者的生命周期内维护多个数据视图。 WiredTiger的内存格式与磁盘格式不同:内存中它将差异存储到文档中,但是当作为定期检查点的一部分刷新到数据文件时,将构建完整版本的文档。

  

这是否意味着无论是完整文档写入还是部分文档写入,它都没有性能差异?

无论MongoDB存储引擎如何处理持久的磁盘更新,在可能的情况下使用部分更新而不是完全更新仍然具有性能优势(特别是如果您设置的字段值相对于整个文档大小较小)。 / p>

例如,考虑:

  • 文档更新的网络流量(任何存储引擎)
  • 日记帐(任何存储引擎)中条目的大小
  • replication oplog(任何存储引擎)中的条目大小
  • 更新内存版本的大小(WiredTiger)

如果您每次都发送完整的文档更新,那么您还可以创建这样的场景:即使更改可能针对不同的字段集,更新到达服务器的顺序也很重要。您可以添加其他应用程序逻辑(例如乐观版本控制)以确保不会意外覆盖字段值,但这可能会增加不必要的复杂性,具体取决于您的用例。