账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    mongodb,upsert的性能是不是随着文档数的增加而变得越来越差?
    30
    0

    upsert的性能是不是随着文档数的增加而变得越来越差?
    那如果是insert呢?是不是就不会有上面的问题?
    我现在有个写多读少的场景,如何保证写入速度最优,且随着集合里面数据越来越多,写入速度不会变差?

    谢谢

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 独自在原地回忆 普通会员 1楼

      在MongoDB中,upsert 是用于更新集合中不存在的文档的函数。当在 upsert 函数中传递的文档不满足集合中指定的唯一键值对时,MongoDB 将执行插入操作,将新的文档插入到集合中,并返回插入结果的文档对象。因此,upsert 的性能受以下几个因素的影响:

      1. 文档数:随着文档数的增加, upsert 的性能会受到以下影响:

      a. 数据复杂度upsert 的操作对象通常是 MongoDB 的文档对象,其中包含了所有字段和数据。随着文档数量的增加,每个文档可能包含的数据量会增加,这会增加操作对象的大小和复杂性,从而导致查询效率降低。

      b. 内存使用:在 MongoDB 中,每个文档的大小通常在 16 MB1 GB 之间。如果文档数量非常大,upsert 的执行过程会涉及到大量的内存分配和复制操作,这可能会导致内存使用量剧增,从而影响系统的性能。

      c. 索引:MongoDB 的索引可以提高查询效率,但也会增加 upsert 的性能开销。如果集合中的文档数较多,同时存在索引,MongoDB 可能会生成更多的索引,从而增加查询的时间和内存消耗。

      1. 查询条件upsert 在处理大量文档时,可能会执行多次查询,以查找是否存在指定的唯一键值对。在这些查询中,MongoDB 需要在每次查询时都会遍历集合中的所有文档,这可能会导致查询效率下降。

      2. 锁等待:当 upsert 进行到某一个文档时,如果当前文档的唯一键值对尚未被其他事务所等待,那么 upsert 将会阻塞当前事务,导致整个集合的并发操作停滞,进一步影响查询效率。

      综上所述,随着文档数的增加,upsert 的性能可能会受到以下影响:

      • 数据复杂度:由于文档包含更多字段和数据,每个文档可能包含的数据量会增加,这会增加查询的复杂度,从而降低性能。
      • 内存使用:由于文档对象的大小通常在 16 MB1 GB 之间,随着文档数的增加,内存使用量可能会急剧增加。
      • 索引:MongoDB 生成的索引数量和类型可能会随着文档数的增加而增加,这可能会增加查询的时间和内存消耗。
      • 锁等待:如果 upsert 进行到某一个文档时,如果当前文档的唯一键值对尚未被其他事务所等待,那么 upsert 将会阻塞当前事务,导致整个集合的并发操作停滞,进一步影响查询效率。

      因此,对于需要频繁插入或更新文档的场景,可能需要考虑使用其他优化策略,如分片、查询优化、数据复制等,以降低 upsert 的性能影响。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部