mongodb的计数性能

hon*_*wei 8 mongodb

我想知道mongodb中的count操作是否适合大型集合。

当我db.collection.count()在一千万行的集合中没有任何条件时,只需要不超过100毫秒。

为什么这么快,它只是从stat的值中读取db.collection.stats().count

Ste*_*nie 7

count()不带查询谓词的A 是从集合统计信息中读取的快速/估算计数,因此无论文档总数如何,都应以固定的时间返回。该值db.collection.stats().count$collStats聚合阶段(MongoDB 3.6+)返回的值相同。注意:使用WiredTiger存储引擎时,收集统计信息会定期保存,并且在非正常关闭后可能不准确

count()与查询条件将提供一个更精确的结果,但会需要遍历一个合适的索引(或如果没有候选索引执行集合扫描)。

您可以通过查看explain()计数来确认查询计划结果。

快速计数的获胜计划只有一个COUNT阶段:

> db.zipcodes.explain().count().queryPlanner.winningPlan
{ "stage" : "COUNT" }
Run Code Online (Sandbox Code Playgroud)

使用索引的中奖计划将有一个COUNT_SCAN输入阶段:

> db.zipcodes.explain().count({city:'Sydney'}).queryPlanner.winningPlan
{
    "stage" : "COUNT",
    "inputStage" : {
        "stage" : "COUNT_SCAN",
        "keyPattern" : {
            "city" : 1
        },
        "indexName" : "city_1",
        "isMultiKey" : false,
        "multiKeyPaths" : {
            "city" : [ ]
        },
        "isUnique" : false,
        "isSparse" : false,
        "isPartial" : false,
        "indexVersion" : 2,
        "indexBounds" : {
            "startKey" : {
                "city" : "Sydney"
            },
            "startKeyInclusive" : true,
            "endKey" : {
                "city" : "Sydney"
            },
            "endKeyInclusive" : true
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

需要收集扫描的计数中奖计划将有一个COLLSCAN输入阶段:

> db.zipcodes.explain().count({cityx:'Sydney'}).queryPlanner.winningPlan
{
    "stage" : "COUNT",
    "inputStage" : {
        "stage" : "COLLSCAN",
        "filter" : {
            "cityx" : {
                "$eq" : "Sydney"
            }
        },
        "direction" : "forward"
    }
}
Run Code Online (Sandbox Code Playgroud)