在 WiredTiger 中对 MongoDb 文档执行部分更新是否比完整文档更新有任何优势?
Does performing a partial update on a MongoDb document in WiredTiger provide any advantage over a full document update?
我正在使用 Java 驱动程序,虽然这个问题不是特定于语言的,但要将部分更新写入 mongodb 文档,因为使用 MMAPv1 存储引擎,文档是就地编辑的(在内存)所以这提供了更好的性能。
这确实增加了相当大的开发复杂性,因为我可以选择一次保存整个文档,而不用担心具体更新内容的细节。更新到 WiredTiger 后,我了解到这个较新的存储引擎不会就地(在内存中)编辑文档,而是为每次写入分配新内存(不清楚这是否意味着文档的完整副本或只是差异)。这是否意味着我进行完整文档写入与部分文档写入没有性能差异?
After updating to WiredTiger I learned that this newer storage engine does not edit documents in place (in memory) but instead allocates new memory for each write (unclear if this means full copy of the document or just diff).
WiredTiger 使用 Multiversion Concurrency Control (MVCC) 为读者的生命周期维护数据的多个视图。 WiredTiger 的 in-memory 格式与 on-disk 格式不同:in-memory 它将差异存储到文档中,但是当作为定期检查点的一部分刷新到数据文件时会构建文档的完整版本.
Does this mean that it makes no performance difference whether I do a full document write vs a partial one?
不管 MongoDB 存储引擎处理磁盘持久更新的方式有多么不同,在可能的情况下使用部分更新而不是完全更新仍然具有性能优势(特别是如果您设置的字段值相对于文档总大小)。
例如,考虑:
- 文档更新的网络流量(任何存储引擎)
- 日志中条目的大小(任何存储引擎)
- replication oplog(任何存储引擎)中条目的大小
- in-memory 个更新版本的大小 (WiredTiger)
如果您每次都发送完整的文档更新,您还会创建更新到达服务器的顺序很重要的场景,即使更改可能针对不同的字段集也是如此。您可以添加其他应用程序逻辑(例如乐观版本控制)以确保您不会意外覆盖字段值,但这可能会增加不必要的复杂性,具体取决于您的用例。
我正在使用 Java 驱动程序,虽然这个问题不是特定于语言的,但要将部分更新写入 mongodb 文档,因为使用 MMAPv1 存储引擎,文档是就地编辑的(在内存)所以这提供了更好的性能。 这确实增加了相当大的开发复杂性,因为我可以选择一次保存整个文档,而不用担心具体更新内容的细节。更新到 WiredTiger 后,我了解到这个较新的存储引擎不会就地(在内存中)编辑文档,而是为每次写入分配新内存(不清楚这是否意味着文档的完整副本或只是差异)。这是否意味着我进行完整文档写入与部分文档写入没有性能差异?
After updating to WiredTiger I learned that this newer storage engine does not edit documents in place (in memory) but instead allocates new memory for each write (unclear if this means full copy of the document or just diff).
WiredTiger 使用 Multiversion Concurrency Control (MVCC) 为读者的生命周期维护数据的多个视图。 WiredTiger 的 in-memory 格式与 on-disk 格式不同:in-memory 它将差异存储到文档中,但是当作为定期检查点的一部分刷新到数据文件时会构建文档的完整版本.
Does this mean that it makes no performance difference whether I do a full document write vs a partial one?
不管 MongoDB 存储引擎处理磁盘持久更新的方式有多么不同,在可能的情况下使用部分更新而不是完全更新仍然具有性能优势(特别是如果您设置的字段值相对于文档总大小)。
例如,考虑:
- 文档更新的网络流量(任何存储引擎)
- 日志中条目的大小(任何存储引擎)
- replication oplog(任何存储引擎)中条目的大小
- in-memory 个更新版本的大小 (WiredTiger)
如果您每次都发送完整的文档更新,您还会创建更新到达服务器的顺序很重要的场景,即使更改可能针对不同的字段集也是如此。您可以添加其他应用程序逻辑(例如乐观版本控制)以确保您不会意外覆盖字段值,但这可能会增加不必要的复杂性,具体取决于您的用例。