> db.data_test.find().explain()
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "mongobench.data_test",
"indexFilterSet" : false,
"parsedQuery" : {
},
"winningPlan" : {
"stage" : "COLLSCAN",
"direction" : "forward"
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "d95ba3e75fb5",
"port" : 27017,
"version" : "4.0.6",
"gitVersion" : "caa42a1f75a56c7643d0b68d3880444375ec42e3"
},
"ok" : 1
}
>
explain.queryPlanner
包含有关查询优化器选择查询计划的信息。
explain.queryPlanner.namespace
一个指定命名空间的字符串。,
explain.queryPlanner.indexFilterSet
一个布尔值,用于指定MongoDB是否为查询形状应用了索引筛选器。
explain.queryPlanner.winningPlan
查询优化器选择的详细计划的文档。MongoDB将计划表示为阶段树;例如,一个阶段可以有一个inputStage,如果该阶段有多个子阶段,则可以有inputStage。
explain.queryPlanner.winningPlan.stage
表示statge名称的字符串。
每个阶段由特定于该阶段的信息组成。例如,IXSCAN阶段将包括索引边界以及特定于索引扫描的其他数据。如果一个阶段有一个子阶段或多个子阶段,该阶段将有一个或多个inputStage。
explain.queryPlanner.winningPlan.inputStage
描述子阶段的文档,该阶段向其父阶段提供文档或索引键。如果父阶段只有一个子阶段,则显示该字段。
explain.queryPlanner.winningPlan.inputStages
描述子阶段的文档数组。子阶段为父阶段提供文档或索引键。如果父阶段有多个子节点,则显示该字段。例如,$或表达式或索引交集的阶段使用来自多个源的输入。
explain.queryPlanner.rejectedPlans
查询优化器考虑和拒绝的候选计划数组。如果没有其他候选计划,该数组可以为空。
> db.data_test.find().explain()
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "mongobench.data_test",
"indexFilterSet" : false,
"parsedQuery" : {
},
"winningPlan" : {
"stage" : "COLLSCAN",
"direction" : "forward"
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "d95ba3e75fb5",
"port" : 27017,
"version" : "4.0.6",
"gitVersion" : "caa42a1f75a56c7643d0b68d3880444375ec42e3"
},
"ok" : 1
}
>
> db.data_test.find().explain("executionStats")
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "mongobench.data_test",
"indexFilterSet" : false,
"parsedQuery" : {
},
"winningPlan" : {
"stage" : "COLLSCAN",
"direction" : "forward"
},
"rejectedPlans" : [ ]
},
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 40000000,
"executionTimeMillis" : 10118,
"totalKeysExamined" : 0,
"totalDocsExamined" : 40000000,
"executionStages" : {
"stage" : "COLLSCAN",
"nReturned" : 40000000,
"executionTimeMillisEstimate" : 8087,
"works" : 40000002,
"advanced" : 40000000,
"needTime" : 1,
"needYield" : 0,
"saveState" : 312502,
"restoreState" : 312502,
"isEOF" : 1,
"invalidates" : 0,
"direction" : "forward",
"docsExamined" : 40000000
}
},
"serverInfo" : {
"host" : "d95ba3e75fb5",
"port" : 27017,
"version" : "4.0.6",
"gitVersion" : "caa42a1f75a56c7643d0b68d3880444375ec42e3"
},
"ok" : 1
}
>
executionStats
返回的executionStats信息详细说明了winning plan。为了在结果中包含executionStats,您必须以以下两种方式运行解释:
executionStats或
allPlansExecution冗长模式。使用allPlansExecution模式包括在计划选择期间捕获的部分执行数据。
explain.executionStats
包含描述winning plan的完整查询执行的统计信息。对于写操作,已完成的查询执行指的是将要执行的修改,但不将修改应用于数据库。
explain.executionStats.nReturned
匹配查询条件的文档数。nreturn对应于MongoDB早期版本中由cursor.explain()返回的n字段。
explain.executionStats.executionTimeMillis
查询计划选择和查询执行所需的总时间(毫秒)。executionTimeMillis对应于MongoDB早期版本中由cursor.explain()返回的millis字段。
explain.executionStats.totalKeysExamined
扫描的索引项的数量。totalkeysexamamed对应于MongoDB早期版本中curor .explain()返回的nscan字段。
explain.executionStats.totalDocsExamined
查询执行期间检查的文档数量。检查文档的常见查询执行阶段是COLLSCAN和FETCH。
totaldocsexamned是指检查的文档总数,而不是返回的文档数。例如,阶段可以检查文档以应用筛选器。如果文档被过滤掉,那么它将被检查,但不会作为查询结果集的一部分返回。
如果在查询执行期间对文档进行多次检查,那么totaldocsexamamed会对每次检查进行计数。也就是说,totaldocsexamned不是所检查的惟一文档总数的计数。
explain.executionStats.executionStages
以阶段树形式详述已完成的winning plan的执行情况;例如,一个阶段可以有一个inputStage或多个inputStage。
每个阶段由特定于该阶段的执行信息组成。
explain.executionStats.executionStages.works
指定查询执行阶段执行的“工作单元”的数量。查询执行将其工作划分为多个小单元。“工作单元”可能包括检查单个索引键、从集合中获取单个文档、将投影应用于单个文档或执行一段内部簿记。
explain.executionStats.executionStages.advanced
此阶段返回到其父阶段的中间结果或高级结果的数量。
explain.executionStats.executionStages.needTime
没有将中间结果推进到其父阶段的工作周期数(参见explain. executionstates . executionstage .advanced)。例如,索引扫描阶段可能花费一个工作周期寻找索引中的新位置,而不是返回索引键;这个工作周期可以算作explain. executionstates . executionstage。需要时间,而不是解释。
explain.executionStats.executionStages.needYield
存储层请求查询阶段暂停处理并生成其锁的次数。
explain.executionStats.executionStages.saveState
查询阶段暂停处理并保存其当前执行状态的次数,例如为生成其锁所做的准备。
explain.executionStats.executionStages.restoreState
查询阶段恢复已保存的执行状态的次数,例如在恢复之前生成的锁之后。
explain.executionStats.executionStages.isEOF
指定执行阶段是否已达到流的结束:
如果为true或1,则执行阶段已达到流结束。
如果false或0,该阶段可能仍然有结果要返回。例如,考虑一个具有限制的查询,该查询的执行阶段由一个带有查询的IXSCAN输入阶段的限制阶段组成。如果查询返回的结果超过指定的限制,则限制阶段将报告isEOF: 1,但其底层IXSCAN阶段将报告isEOF: 0。
explain.executionStats.executionStages.inputStage.keysExamined
对于扫描索引的查询执行阶段(例如IXSCAN), keysexamamed是索引扫描过程中检查的边界内键和边界外键的总数。如果索引扫描包含单个连续的键范围,则只需要检查边界内的键。如果索引边界包含多个键范围,索引扫描执行过程可能会检查越界键,以便从一个范围的末尾跳到下一个范围的开头。
db.keys.find( { x : { $in : [ 3, 4, 50, 74, 75, 90 ] } } ).explain( "executionStats" )
查询将扫描键3和4。然后,它将扫描键5,检测它是否越界,并跳到下一个键50。
继续这个过程,查询扫描键3、4、5、50、51、74、75、76、90和91。键5、51、76和91是仍在检查的越界键。keysexamned的值是10。
explain.executionStats.executionStages.inputStage.docsExamined
指定在查询执行阶段扫描的文档数量。
用于COLLSCAN阶段,以及用于从集合中检索文档的阶段(例如FETCH)
explain.executionStats.executionStages.inputStage.seeks
新版本3.4:仅适用于索引扫描(IXSCAN)阶段。
为了完成索引扫描,我们必须将索引游标定位到新位置的次数。
explain.executionStats.allPlansExecution
包含在计划选择阶段为winning plan和rejected plan捕获的部分执行信息。只有当explain在allPlansExecution冗长模式下运行时,该字段才会出现。