【问题标题】:Mongo DB - Slow upsert performanceMongodb - 缓慢的 upsert 性能
【发布时间】:2022-10-18 04:28:58
【问题描述】:

我正在寻找方法来提高我的 mongoDB 应用程序的 upsert 性能。在我的测试程序中,我有一个“用户”集合,它有一个“id”(类型 - 数字)和一个“名称”(类型 - 字符串)属性。 'id' 上有一个唯一索引。

问题: 执行批量写入时(有序:false) - 启用 upsert 的 updateOne 或 replaceOne 似乎比“insertOne”慢 6 到 8 倍。

我的索引:

await getDb().collection('user').createIndex({
            id: 1
        }, {
            unique: true,
            name: "id_index"
        });

100,000 个用户的示例 replaceOne(耗时 8.8 秒):

operations.push({
            replaceOne: {
                filter: {id: 1},
                replacement: {id: 1, name: "user 1"},
                upsert: true
            }
    })

示例 updateOne(耗时 8.4 秒)100,000 个用户:

  operations.push({
            updateOne: {
                filter: {id: 1},
                update: {$set:{name: "user 1"}},
                upsert: true
            }
        })

示例 insertOne(耗时 1.3 秒)100,000 个用户:

  operations.push({
            insertOne: {id: 1, name: "user 1"}
        })

注意 - 每次我执行这些测试时,都会清空集合,并重新创建索引。

这是可以预期的吗?

我还能做些什么来提高 upsert 性能吗?我在 bulkWrite 上修改了 writeConcern,几乎没有影响。

【问题讨论】:

    标签: javascript mongodb


    【解决方案1】:

    我正在“关注”这个问题,看看会发生什么。看到一周内没有答案,我会提供我自己的。

    在没有进一步信息的情况下,我认为您自己提供的证据是相当有力的证据,表明答案是“是的,这是意料之中的”。虽然我们不知道您的测试执行了多少更新与插入或您使用的数据库版本等细节,但比较似乎没有任何明显的错误。 upsert documentation 建议数据库在执行插入之前首先检查是否存在将由命令更新的文档。以下文字进一步暗示了这一点lower on the same page(强调添加):

    如果所有update() 操作完成查询阶段在任何客户端成功插入数据之前,并且name字段上没有唯一索引,每个update()操作都可能导致插入,创建多个带有name: Andy的文档。

    基于所有这些,我认为完全合理地推测upsert 操作的update 部分对直接insert 操作不存在的操作有明显的开销。

    鉴于这些信息,我认为它提出了一些需要考虑的额外问题:

    1. 您了解这些信息的目的是什么?只是为了确保您已优化配置,或者您目前没有达到某些性能目标?
    2. 根据各种因素,也许这里的替代方法是尝试插入(或更新)并在之后单独处理异常?
    3. 也许出于好奇,拥有一个分离there is already one present for the _id fieldunique 索引id?当然,每个新索引(unique 或不)都会增加一些开销,所以也许最好重新调整所需的_id 字段和索引来满足您的特定需求?

    【讨论】:

      猜你喜欢
      • 2014-09-18
      • 2021-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      • 2015-01-27
      • 2021-06-04
      • 2016-11-09
      相关资源
      最近更新 更多