6

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

4

1 回答 1

4

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

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

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

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

例如,考虑:

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

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

于 2018-04-03T07:49:01.653 回答