首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDB: Update/Upsert

MongoDB: Update/Upsert
EN

Stack Overflow用户
提问于 2016-01-31 10:34:35
回答 2查看 34.2K关注 0票数 24

最近,我注意到在执行多个上层服务器(通过散装作业)与插入(多个文档)之间存在着巨大的性能差异。我想知道我在这方面是否正确:

  • 向上插入/更新将类似于find()update(),因此它可以执行两项读写操作
  • 插入只会写,所以速度要快得多

那么性能的差异呢?

如果是这样的话,我想知道我是否需要大量的定期写入,而不是更新一个文档,而是用一个createdOn字段编写一个新文档。然后,为了进行查询,我将只查询按createdOn DESC排序的文档。我想知道这是不是个好方法?还是有更好的方法?

  • 我想知道我是否在集合上有索引,它能加快更新速度吗?但是这个索引会不会减缓写部分的速度?
  • 第二种方式,我只做插入,会不会慢下来,然后我有太多的文件?(加速写作)实用吗?
  • 我也尝试过增加连接池的大小。不确定最优的是什么,但我尝试了20,我看到我可以通过mongostat每秒处理20次查询。我还以为会高很多呢。
EN

回答 2

Stack Overflow用户

发布于 2017-01-16 04:11:02

如果要插入文档,MongoDB需要检查具有相同ObjectId的文档是否存在。如果存在,则无法插入文档。

同样的情况也适用于更新。它需要检查文档是否存在。否则,无法执行更新。当更新查询无法根据ObjectId / indexed字段找到文档时,更新查询就会减慢。

否则,插入/更新文档的性能应该是相同的。

所以插入可以像这样//(快速)

  1. (检查文档->未找到->插入新文档)
  2. (检查文档->找到的->无法插入)

并使用向上插入更新(ObjectId可用)//(快速)

  1. (检查文档->未找到->插入新文档)
  2. (检查文档->找到的->更新文档)

或者用向上插入更新(没有ObjectId) //这很慢

  1. (查找ObjectIds (慢速) ->未找到->插入新文档)
  2. (查找ObjectIds (慢速) -> Find->更新文档)
票数 34
EN

Stack Overflow用户

发布于 2016-12-17 16:17:14

我还没有找到关于upsert如何在MongoDB中工作的“正式”解释,但可以肯定地假定,因为操作的目的是更新现有文档,并且只有在无法找到具有给定条件的文档时才添加文档。

如果您添加了一个索引,那么upsert会变得更快:在所有索引被用来“查找”文档之后。注意事项在索引操作的字段和您正在更新的字段中。如果更新的部分是索引的一部分,则将对更新文档产生性能影响。如果更新的部分不是索引的一部分,则不会因在现有文档中写入而受到惩罚。但是,如果添加了文档,则会对性能产生较小的影响,因为索引集合是更新的。但是,尽管如此:仅仅添加一个文档仍然会更快。

因此,如果在您的场景中您知道您不想更新文档,那么插入通常会更快。如果要确保不添加同一文档两次,也可以选择添加唯一索引。那么插入就会简单地失败。

总之,这取决于具体情况,但根据我可以从您的问题中提取的信息,我认为最好的选择是简单地插入文档。因为您似乎要确保“createdon”字段使文档在您的场景中是唯一的,所以您只需担心在读取场景中使用的索引。

一些额外的信息可以在MongoDB站点上找到:

有关设计(阅读)索引的更多信息,可以找到关于查找索引是否向查询计划添加了任何内容的相当好的解释:这里

我希望这能帮到你。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35112836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档