每当我使用explain在MongoDB上运行计数查询时,我会看到两个不同的阶段COUNT_SCAN和IXSCAN。我想知道它们在性能方面的区别,以及如何改进查询。以下查询:
db.collection.explain(true).count({field:1}})
使用COUNT_SCAN和类似以下的查询:
db.collection.explain(true).count({field:"$in":[1,2]})
使用IXSCAN。
3j86kqsm1#
COUNT_SCAN是通过从索引阅读值来获取计数的最有效的方法,但只能在某些情况下执行,否则,IXSCAN将在对文档进行一些筛选并在内存中进行计数之后执行。当从辅助服务器阅读时,使用读取关注available。此关注级别不考虑分片簇中的孤立文档,因此不会执行SHARDING_FILTER阶段。这是您看到COUNT_SCAN时的情况。但是,如果我们使用read concern local,则需要获取文档以执行SHARDING_FILTER过滤器阶段。在这种情况下,需要多个阶段来完成查询:然后是FETCH然后是SHARDING_FILTER。
COUNT_SCAN
IXSCAN
available
SHARDING_FILTER
local
FETCH
1条答案
按热度按时间3j86kqsm1#
COUNT_SCAN
是通过从索引阅读值来获取计数的最有效的方法,但只能在某些情况下执行,否则,IXSCAN
将在对文档进行一些筛选并在内存中进行计数之后执行。当从辅助服务器阅读时,使用读取关注
available
。此关注级别不考虑分片簇中的孤立文档,因此不会执行SHARDING_FILTER
阶段。这是您看到COUNT_SCAN
时的情况。但是,如果我们使用read concern
local
,则需要获取文档以执行SHARDING_FILTER过滤器阶段。在这种情况下,需要多个阶段来完成查询:然后是FETCH
然后是SHARDING_FILTER
。