我想知道mongodb中的大Collection 计数操作.
当我在一个db.collection.count()
0万行的集合中做db.collection.count()
个没有任何标准的时候,只需要不超过db.collection.count()
毫秒.
为什么这么快,只是从统计值db.collection.stats().count
读取?
我想知道mongodb中的大Collection 计数操作.
当我在一个db.collection.count()
0万行的集合中做db.collection.count()
个没有任何标准的时候,只需要不超过db.collection.count()
毫秒.
为什么这么快,只是从统计值db.collection.stats().count
读取?
没有查询谓词的count()
是从集合统计信息中读取的快速/估计计数,因此无论文档总数如何,都应该以恒定时间返回.这与db.collection.stats().count
和$collStats
aggregation stage(MongoDB 3.6+)返回的值相同.注意:在WiredTiger存储引擎中,收集统计信息会定期保存和更新.
带有查询条件的count()
将提供更准确的结果,但需要迭代合适的索引(如果没有候选索引,则执行集合扫描).
您可以通过查看explain()
个输出来确认查询计划结果.
快速计数的获胜计划只有COUNT
个阶段:
> db.zipcodes.explain().count().queryPlanner.winningPlan
{ "stage" : "COUNT" }
使用索引计数的获胜计划将有一个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
}
}
}
需要收集扫描的计数的获胜计划将有一个COLLSCAN
输入阶段:
> db.zipcodes.explain().count({cityx:'Sydney'}).queryPlanner.winningPlan
{
"stage" : "COUNT",
"inputStage" : {
"stage" : "COLLSCAN",
"filter" : {
"cityx" : {
"$eq" : "Sydney"
}
},
"direction" : "forward"
}
}