我想知道mongodb中的count操作是否适合大型集合。
当我db.collection.count()在一千万行的集合中没有任何条件时,只需要不超过100毫秒。
为什么这么快,它只是从stat的值中读取db.collection.stats().count?
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)
| 归档时间: |
|
| 查看次数: |
3549 次 |
| 最近记录: |