【问题标题】:MongoDB: Update/Upsert vs InsertMongoDB:更新/更新与插入
【发布时间】:2016-05-08 20:37:51
【问题描述】:

最近我注意到执行多个 upsert(通过 bulk operations)与插入(多个文档)之间存在巨大的性能差异。我想知道我是否正确:

  • Upsert/Updates 将类似于 find()update(),因此它读取和写入 2 件事
  • Insert 只会写入,因此速度会快很多

因此性能差异?

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

  • 我想知道我的收藏是否有索引,它会加快更新速度吗?但是这个索引不会减慢写入部分的速度吗?
  • 使用第二种方式,我只做插入,它会变慢然后我有太多的文档吗?是否实用(加快写入速度)?
  • 我也尝试增加连接池大小。不知道什么是最佳的,但我尝试了 20 个,我发现我可以通过 mongostat 每秒处理大约 20 个查询。我预计它会更高。

【问题讨论】:

  • 一般来说,索引只是为了加快读取速度。不写。
  • => 每次创建不同的文档:这将是一个很好的解决方案,具体取决于您添加文档的频率。如果文档数量在很短的时间内会变得很大,那么您的查找查询将会变慢。我不会使用这个 bcos 我在每个查询中都有订单文档......即使我必须得到一个文档。

标签: mongodb mongodb-query upsert


【解决方案1】:

我还没有找到关于upsert 如何在 MongoDB 中工作的“官方”解释,但是可以肯定的是,因为该操作旨在更新现有文档,并且仅在文档与找不到给定的条件。

如果添加索引,那么upsert 会变得更快:毕竟索引用于“查找”文档。需要注意的是索引操作的字段和您正在更新的字段。如果更新的部分是索引的一部分,您将对更新文档产生性能影响。如果更新的部分不是索引的一部分,您将不会因在现有文档中写入而受到处罚。但是,如果添加了文档,则会对性能产生轻微影响,因为索引集合是更新的。但仍然:仅添加文档会更快。

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

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

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

有关设计(读取)索引的更多信息,可以在here 找到关于确定索引是否向查询计划添加任何内容的很好解释:

我希望这会有所帮助。

【讨论】:

    【解决方案2】:

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

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

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

    所以插入可以是这样的 //(Fast)

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

    并使用 upsert 更新(ObjectId 可用)//(快速)

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

    或者用 upsert 更新(没有 ObjectId) //这很慢

    1. (查找 ObjectIds(慢)-> 未找到 -> 插入新文档)否则
    2. (查找 ObjectIds(慢)-> 找到 -> 更新文档)

    【讨论】:

    • 如果您的 Id 的索引不是 ObjectId 类型怎么办
    • @eranotzap 操作将像 ObjectId 字段一样快。
    • 这等于什么都没说,什么意思?
    • @eranotzap ObjectId 的插入、更新和删除等操作很快,因为它默认索引。因此,任何被索引的字段都可以像 ObjectIds 一样快速地插入、更新和删除
    • 你不明白这个问题。我是说如果我不使用 ObjectId(The Type) 作为我的 ID,将其替换为 Date 并为其编制索引。那也一样快。
    猜你喜欢
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 2012-04-21
    • 1970-01-01
    相关资源
    最近更新 更多