最近用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()查看,同样发现,它用上了复合索引:
网上没找到答案,在此记录一下。