MongoDB:explain执行计划
一、基本语法
> db.user.find().explain()
查看结果
{
"explainVersion" : "1",
"queryPlanner" : {
"namespace" : "test.user",
"indexFilterSet" : false,
"parsedQuery" : {
},
"queryHash" : "8B3D4AB8",
"planCacheKey" : "D542626C",
"maxIndexedOrSolutionsReached" : false,
"maxIndexedAndSolutionsReached" : false,
"maxScansToExplodeReached" : false,
"winningPlan" : {
"stage" : "COLLSCAN",
"direction" : "forward"
},
"rejectedPlans" : [ ]
},
"command" : {
"find" : "user",
"filter" : {
},
"$db" : "test"
},
"serverInfo" : {
"host" : "eff44688aa5e",
"port" : 27017,
"version" : "5.0.6",
"gitVersion" : "212a8dbb47f07427dae194a9c75baec1d81d9259"
},
"serverParameters" : {
"internalQueryFacetBufferSizeBytes" : 104857600,
"internalQueryFacetMaxOutputDocSizeBytes" : 104857600,
"internalLookupStageIntermediateDocumentMaxSizeBytes" : 104857600,
"internalDocumentSourceGroupMaxMemoryBytes" : 104857600,
"internalQueryMaxBlockingSortMemoryUsageBytes" : 104857600,
"internalQueryProhibitBlockingMergeOnMongoS" : 0,
"internalQueryMaxAddToSetBytes" : 104857600,
"internalDocumentSourceSetWindowFieldsMaxMemoryBytes" : 104857600
},
"ok" : 1
}
参数含义:
| 参数 | 含义 |
|---|---|
| explainVersion | 查询计划版本 |
| namespace | 要查询的集合 |
| indexFilterSet | 是否使用索引 |
| parsedQuery | 查询条件 |
| winningPlan | 最佳执行计划 |
| stage | 查询方式,常见的有COLLSCAN/全表扫描、IXSCAN/索引扫描、FETCH/根据索引去检索文档、SHARD_MERGE/合并分片结果、IDHACK/针对_id进行查询 |
| filter | 过滤条件 |
| direction | 搜索方向 |
| rejectedPlans | 拒绝的执行计划 |
| serverInfo | MongoDB服务器信息 |
二、基本用法
-
explain.queryPlanner.namespace:该值返回的是该query所查询的表
-
explain.queryPlanner.indexFilterSet:针对该query是否有indexfilter
-
explain.queryPlanner.winningPlan:查询优化器针对该query所返回的最优执行计划的详细内容。
-
explain.queryPlanner.winningPlan.stage:最优执行计划的stage,这里返回是FETCH,可以理解为通过返回的index位置去检索具体的文档
-
Explain.queryPlanner.winningPlan.inputStage:用来描述子stage,并且为其父stage提供文档和索引关键字。
-
explain.queryPlanner.winningPlan.stage的child stage,此处是IXSCAN,表示进行的是index scanning。
-
explain.queryPlanner.winningPlan.keyPattern:所扫描的index内容,此处是did:1,status:1,modify_time: -1与scid : 1
-
explain.queryPlanner.winningPlan.indexName:winning plan所选用的index。
-
explain.queryPlanner.winningPlan.isMultiKey是否是Multikey,此处返回是false,如果索引建立在array上,此处将是true。
-
explain.queryPlanner.winningPlan.direction:此query的查询顺序,此处是forward,如果用了.sort({modify_time:-1})将显示backward。

663

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



