执行查询时,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会返回与下面类似的文档:
MongoDB查询计划缓存统计与分析,

本文介绍了如何通过$planCacheStats阶段获取MongoDB查询计划缓存数据,包括不同执行引擎的输出格式,以及使用示例和注意事项。
最低0.47元/天 解锁文章
1263

被折叠的 条评论
为什么被折叠?



