每当我在MongoDB上运行计数查询时,我都可以看到两个不同的阶段COUNT_SCAN和IXSCAN。我想根据性能了解它们之间的区别,以及如何改进查询。 字段已编入索引。
query db.collection.explain(true).count({field:1}})使用COUNT_SCAN和查询
db.collection.explain(true).count({field:" $ in":[1,2]})使用IXSCAN。
答案 0 :(得分:1)
简写:COUNT_SCAN
是通过从索引中读取值来获得计数的最有效方法,但是只能在某些情况下执行。否则,将执行IXSCAN
,然后进行一些文档过滤和内存计数。
从辅助读取时,将使用读取关注点available
。此关注级别不考虑分片群集中的孤立文档,因此不会执行任何SHARDING_FILTER
阶段。这是您看到COUNT_SCAN
的时候。
但是,如果我们使用读取关注点local
,则需要获取文档以执行SHARDING_FILTER过滤器阶段。在这种情况下,有多个阶段可以完成查询:IXSCAN
,然后依次是FETCH
和SHARDING_FILTER
。