Mongodb中distinct性能问题

本文通过实际测试分析了MongoDB中distinct命令在处理特定查询时的性能问题。在表usertable(2000w记录)上,对有索引的字段进行distinct操作时,发现耗时较长且CPU占用高。例如,查询userid为'张三'的region字段,虽然使用了索引,但执行时间接近1秒,CPU消耗约30%。对于是否distinct仅针对query查询的索引有效,而非去重字段的索引,文中提出了疑问,并分享了类似问题的测试情况,即在同时指定userid和region的条件下,distinct操作依然性能不佳。
摘要由CSDN通过智能技术生成

           最近用mongodb的distinct做了以下的一个测试:

 

表名:usertable

表中document总数:2000w左右

字段名:符合  userid = "张三"  条件的有100w条记录,有索引

                符合  region="华南",且floor="3层"  条件的记录有90w条,且有复合索引

 

测试一:

           db.usertable.distinct("region", {userid:"张三"})

           输出的结果为:[ "华北", "华中", "华南" ]。

本来结果没什么问题,主要问题在于耗时特别长,有1s左右,可以执行该次操作的时候,CPU消耗了30%左右。查了一下官网上关于distinct的介绍:

从介绍来看,distinct命令应该有用到了索引,为了确认,用explain()命令查看,发现索引确实生效了:

            db.usertable.explain().distinct("region", {userid:"张三"})

那么问题来了,既然distinct有用到了索引,在数据量为100w的情况下,为什么耗时那么多,CPU消耗如此大,看起来就像是在遍历一样呢?还是说,distinct只针对query查询的索引有效,而对于需要去重的字段region的索引是不起作用的呢?

 

测试二:

           db.usertable.distinct("floor", {userid:"张三",region:"华南"})

           输出的结果为:[ "1层", "3层", "4层" ]。

这次测试结果也如同上面一样,耗时多,CPU消耗大,用explain()查看,同样发现,它用上了复合索引:

网上没找到答案,在此记录一下。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值