每当我使用解释在 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。
简而言之:COUNT_SCAN是通过从索引读取值来获取计数的最有效方法,但只能在某些情况下执行。否则,IXSCAN将执行一些文档过滤和内存计数。
available当从辅助读取时,使用读取关注点。此关注级别不考虑分片集群中的孤立文档,因此不会SHARDING_FILTER执行任何阶段。这是你看到的时候COUNT_SCAN。
但是,如果我们使用读取关注local,我们需要获取文档才能执行 SHARDING_FILTER 过滤阶段。在这种情况下,有多个阶段来完成查询:IXSCAN,FETCH然后SHARDING_FILTER。