mongodb中upsert和insert的使用注意

新服务已经上线跑了差不多两周,暴露出一个问题,我们发现db进行upsert的速度越来越慢,以前两个小时就能消费完队列里的数据,现在需要四五个小时,并且消耗时间是呈现不断上升的趋势。所以我觉得应该是和upsert这个操作有关。

问题定位:
1,由于是写多读少的场景,所以我们并没有对集合加入索引。并且经查阅资料发现,mongodb索引的存储机制和mysql不同,mysql的索引是存储在硬盘中,需要时会调用部分到内存中。而mongodb的索引则是直接存储在内存和临时文件中,并且和内存大小限制有很直接的关系,如果超过内存限制,则从硬盘加载索引。所以mongodb索引的使用,在大数据集合面前,会面临内存耗尽的风险。

下面这个链接是官方对索引使用限制的说明:
https://docs.mongodb.com/manual/reference/limits/#index-limitations
这里写图片描述

2,upsert操作会先在集合中进行数据查找,如果数据已经存在,则更新,否则才插入。数据的查找那就势必会使用索引,mongo索引用的是B树,时间复杂度为Olog(n),而没有索引的情况下则时间复杂度是O(n),差别见下图:
这里写图片描述

问题显而易见了,随着数据日益增多,upsert性能是线性下滑的,所以后来决定使用insert,因为确实队列中重复数据的概率是比较小的,为了这个概率而损失性能和时间,划不来。

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值