举个例子我有一个查询是
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在性能上有什么区别呢?
xiaoxu 发表新评论
测了很久终于测出问题所在,似乎是因为索引里的日期字段是个单向排序,而查询语句里的日期查的是一个区间,导致了这个查询语句不能完全走这个索引,而在explain里似乎并看不出来这一点
那你的最终优化方案是什么
f只是指定是降序而已,跟区间没有关系,而不是你索引不是最优的。改成a:1,b:1,f:-1或者f:1就可以
总数据量是三千多万,第一步IXSCAN获得了13万,第二步FETCH得到最终的一万结果
总数据量是三千多万,第一步IXSCAN得到了13万,第二步FETCH得到最终的1万条结果
总数据量是三千多万,第一步IXSCAN获得了13万数据,第二步FETCH获得了最终的1万结果
总数据量是三千多万,第一步IXSCAN获得了13万数据,第二步FETCH获得了最终1万结果
f只是指定是降序而已,跟区间没有关系,而不是你索引不是最优的。改成a:1,b:1,f:-1或者f:1就可以
count可以使用覆盖索引,正常情况count应该比find更快。
你索引应该创建{a:1,b:1,f:1}.
可以发个完整执行计划带上executionStats