执行查询时,MongoDB 查询规划器会根据可用索引选择并缓存效率最高的查询计划。$planCache
可以返回所有集合的查询计划缓存信息。要使用$planCache
,必须把$planCacheStats
阶段放在管道最前面。
语法
{
$planCacheStats: {
} }
使用
$planCacheStats
必须是管道的第一个阶段$planCacheStats
不能应用于事务和$facet
阶段$planCacheStats
需要的读关注级别为"local"- 如果系统启用了权限控制,用户必须要有对集合的
planCacheRead
授权 - 当使用查询加密,
$planCacheStats
阶段会忽略对加密集合的操作,即便是操作被正常缓存。
读取偏好
$planCacheStats
在选择返回计划缓存信息的主机时,会遵守读取偏好。
应用程序可能以副本集的不同成员为目标。因此,每个副本集成员可能会收到不同的读取命令,并拥有与其他成员不同的计划缓存信息。尽管如此,在副本集或分片集群上运行$planCacheStats
仍会遵守正常的读取优先规则。也就是说,在副本集上,该操作只从副本集的一个成员处收集计划缓存信息;在分片集群上,该操作只从每个分片副本集的一个成员处收集计划缓存信息。
输出
$planCacheStats
的输出取决于完成查询所使用的查询引擎,version
字段的值表明使用了哪个查询引擎:
1
表示使用了经典引擎。2
表示使用了基于时隙的查询执行引擎。
经典执行引擎
对于使用经典执行引擎的查询,$planCacheStats
会返回与下面类似的文档:
{
"version" : 1,
"createdFromQuery" : <document>,
"queryHash" : <hexadecimal string>,
"planCacheKey" : <hexadecimal string>,
"isActive" : <boolean>,
"works" : <NumberLong>,
"cachedPlan" : {
"stage" : <STAGE1>,
"filter" : <document>,
"inputStage" : {
"stage" : <STAGE2>,
...
}
},
"timeOfCreation" : <date>,
"creationExecStats" : [ //每个候选计划的执行统计文档
{
"nReturned" : <num>,
"executionTimeMillisEstimate" : <num>,
"totalKeysExamined" : <num>,
"totalDocsExamined" :<num>,
"executionStages" : {
"stage" : <STAGE A>,
...
"inputStage" : {
"stage" : <STAGE B>,
...
}
}
},
...
],
"candidatePlanScores" : [
<number>,
...
],
"indexFilterSet" : <boolean>,
"estimatedSizeBytes" : <num>,
"host" : <string>,
"shard" : <string>
}
对于使用基于slot的查询执行引擎的查询,$planCacheStats
会返回与下面类似的文档ÿ