COUNT_SCAN 和 IXSCAN 有什么区别?

Rah*_*hul 11 mongodb

每当我使用解释在 MongoDB 上运行计数查询时,我都可以看到两个不同的阶段 COUNT_SCAN 和 IXSCAN。我想知道它们之间的性能差异以及如何改进查询。字段已编入索引。

以下查询:

db.collection.explain(true).count({field:1}})
Run Code Online (Sandbox Code Playgroud)

使用 COUNT_SCAN 和查询如下:

db.collection.explain(true).count({field:"$in":[1,2]})
Run Code Online (Sandbox Code Playgroud)

使用 IXSCAN。

Nic*_*ell 9

简而言之:COUNT_SCAN是通过从索引读取值来获取计数的最有效方法,但只能在某些情况下执行。否则,IXSCAN将执行一些文档过滤和内存计数。

available当从辅助读取时,使用读取关注点。此关注级别不考虑分片集群中的孤立文档,因此不会SHARDING_FILTER执行任何阶段。这是你看到的时候COUNT_SCAN

但是,如果我们使用读取关注local,我们需要获取文档才能执行 SHARDING_FILTER 过滤阶段。在这种情况下,有多个阶段来完成查询:IXSCANFETCH然后SHARDING_FILTER