0

举个例子我有一个查询是

db.col.find({‘a’:1, ‘b’:2, ‘f’:{$gte:{ISODate(‘2021-11-20’),$lte:{ISODate(‘2021-11-25’)}}

然后我有一个索引是

{‘a’:1, ‘b’:1, ‘c’:1, ‘d’:1, ‘e’:1, ‘f’: -1}

在explain(‘executionStats’)可以看到这个查询是走了这条索引的,从索引13万条数里定位到了1万条标的,用时1秒,但是同样的查询语句我count的时候就需要花费30几秒,请问这是什么原因呢,有没有什么解决办法呢。

另外,当我用itcount()的时候查询时间缩短到了6秒,这又是为什么呢,itcount和count在性能上有什么区别呢?

发表新评论

count可以使用覆盖索引,正常情况count应该比find更快。
你索引应该创建{a:1,b:1,f:1}.
可以发个完整执行计划带上executionStats

测了很久终于测出问题所在,似乎是因为索引里的日期字段是个单向排序,而查询语句里的日期查的是一个区间,导致了这个查询语句不能完全走这个索引,而在explain里似乎并看不出来这一点

那你的最终优化方案是什么

f只是指定是降序而已,跟区间没有关系,而不是你索引不是最优的。改成a:1,b:1,f:-1或者f:1就可以