更新/插入子文档时的 mongodb 性能

Posted

技术标签:

【中文标题】更新/插入子文档时的 mongodb 性能【英文标题】:mongodb performance when updating/inserting subdocuments 【发布时间】:2015-08-15 08:49:49 【问题描述】:

我有一个 mongo 数据库,用于表示具有三个集合的电子表格,分别代表单元格值(行、列、值)、单元格格式(行、列、表示格式的对象)和单元格大小(无论是行大小还是列大小,它的索引和大小)。 所有集合中的每个文档还有一个字段来标识它所引用的表(包含表的名称),我正在使用 upserts(猫鼬的 findOneAndReplace 方法和 upsert:true)进行所有插入/更新。 我正在考虑“将模式从里到外”,通过保留一个代表表的集合并将先前包含在三个集合中的文档作为子文档放在其中,因为我认为这会使它更有条理. 但是,阅读子文档的主题后,看起来无论如何每次插入/更新都需要两个查询(例如,see this question)。因此,我想知道我想到的更改是否会导致性能下降(我猜 upserts 仍然需要进行搜索,然后更新或插入,所以这仍然是幕后的两个查询,但可能进行一些我不知道的优化)并且在尝试简化架构时,我不仅会使插入/更新过程复杂化,而且性能也会降低。谢谢!

【问题讨论】:

任何答案都可能主要是基于意见的。无论如何,您应该问自己一件事是如何您打算使用数据:您将向数据库发送什么样的查询?你能负担得起将整个电子表格保存在 RAM 中吗?有没有机会达到 16MB 的限制?是否有某些单元格的并发更新?你会有“受保护”的细胞吗?为您的应用程序回答这些问题(以及许多其他问题)将帮助您设计您的架构。 谢谢你,你提出了一些好的观点..特别是关于查询类型。我预计主要是写查询,所以我可能会坚持我已经拥有的 【参考方案1】:

是的,性能受到影响。 MongoDB 具有集合级别的更新锁。通过将所有内容保存在单个集合中,您最终会限制应用程序可以执行的并发更新操作的数量,从而导致性能下降。需要注意的是,它完全取决于您的应用程序如何进行写入。

另一方面,您可能会节省读取操作,因为您需要查询单个集合而不是 3 个。但是,与写入相比,扩展读取很容易,并且写入通常是瓶颈,所以它的种类很难说这是否值得。

【讨论】:

以上是关于更新/插入子文档时的 mongodb 性能的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB安装和入门

MongoDB - 使用 javascript 更新子文档

MongoDB - 使用 javascript 更新子文档

如何从 R 在 MongoDB 中批量插入文档?

03 MongoDB文档的各种增加更新删除操作总结

MongoDB - 对时间序列子文档进行范围查询