【发布时间】:2022-02-21 21:12:31
【问题描述】:
我有一组用户。每个用户都有一个经常更新的“地理位置”字段(每次用户显着移动时)。由于我希望在更新时在文档级别而不是集合级别上实现并发,因此我使用的是 WiredTiger 存储引擎。
我了解到,使用 WiredTiger,文档中的每次更新都会创建一个新文档:
http://learnmongodbthehardway.com/schema/wiredtiger/
WiredTiger 不支持就地更新
然而,这篇文章还说“即使 [WiredTiger] 不允许就地更新,它在许多工作负载上的性能仍然优于 MMAP”。这是什么意思?使用 WiredTiger 时必须注意的确切含义是什么?例如,如果没有就地更新,数据库大小会快速增长吗?还有其他需要注意的事项吗?
我还了解到,MongoDB 3.6 中的 WiredTiger 添加了存储增量的功能,而不是重写整个文档 (https://jira.mongodb.org/browse/DOCS-11416)。这到底是什么意思?
注意: 另外我不明白的是,现在大多数(如果不是全部)硬盘驱动器的扇区大小为 4096 字节,因此您不能只写入 4 个字节的硬盘驱动器(例如),但必须写入 4096 字节的完整块(因此先读取它,更新其中的 4 个字节,然后再写入)。由于大多数文档通常小于 4096 字节,这是否意味着在任何情况下都需要重写整个文档(即使使用 MMAP)。我错过了什么?
【问题讨论】:
-
你读过那句话之后的那句话吗?它说“将重写整个文件”。这意味着
$setWT 将读取文档、应用补丁并覆盖文档,而 mmapv1 只会覆盖该字段。我认为这与压缩有关。 -
“数据库大小会增长得很快吗” - 好问题,但很容易测试。创建一个测试数据库并对其进行几亿次就地更新。前后检查数据库大小。
-
@SergioTulentsev :是的,但我想确认一下,因为我不明白现在大多数(如果不是全部)硬盘驱动器的扇区大小为 4096 字节,你不能写入hardrive 仅 4 个字节(例如),但您必须写入 4096 个字节的完整块(因此先读取它,更新其中的 4 个字节,然后再写入)。由于大多数文档通常小于 4096 字节,这意味着它看起来与 MMAP 中的行为相同……我错过了什么?
-
你在想一个错误的抽象。 “覆盖这个 10 字节字段”与“将这个脏映射页提交到磁盘”是分开完成的。后者由操作系统完成,与前者关系不大,后者是实际的就地更新。
-
仅供参考,我回答了一个相关(但有些不同)的问题,恰好出现在侧边栏中:Does performing a partial update on a MongoDB document in WiredTiger provide any advantage over a full document update?。
标签: mongodb wiredtiger