explain()
是MongoDB的一个重要的查询论断工具,这个函数能够提供大量的与查询相关的信息,该函数会返回查询计划、执行状态、服务器信息,根据这些信息可以有针对性的对性能进行优化。
1. explain()
函数
cursor.explain(verbosity)
查看db.collection.find()
的执行查询计划信息时,explain()
的使用方法如下:
db.collection.find().explain()
explain()
方法的参数如下:
verbose
:{String},可选参数。指定冗长模式的解释输出,方式指定后会影响explain()
的行为及输出信息。可选值有:
"queryPlanner"
、"executionStats"
、"allPlansExecution"
,默认为"queryPlanner"
2. explain()
返回信息
explain()
的返回值有:
queryPlanner
(查询计划):查询优化选择的计划细节和被拒绝的计划。其可能包括以下值:queryPlanner.namespace
-一个字符串,运行查询的指定命名空间queryPlanner.indexFilterSet
-一个布尔什,表示MongoDB在查询中是否使用索引过滤queryPlanner.winningPlan
-由查询优化选择的计划文档winningPlan.stage
-表示查询阶段的字符串winningPlan.inputStage
-表示子过程的文档winningPlan.inputStages
-表示子过程的文档数组
queryPlanner.rejectedPlans
-被查询优化备选并被拒绝的计划数组
executionStats,
(执行状态):被选中执行计划和被拒绝执行计划的详细说明:queryPlanner.nReturned
-匹配查询条件的文档数queryPlanner.executionTimeMillis
-计划选择和查询执行所需的总时间(毫秒数)queryPlanner.totalKeysExamined
-扫描的索引总数queryPlanner.totalDocsExamined
-扫描的文档总数queryPlanner.totalDocsExamined
-扫描的文档总数queryPlanner.executionStages
-显示执行成功细节的查询阶段树executionStages.works
-指定查询执行阶段执行的“工作单元”的数量executionStages.advanced
-返回的中间结果数executionStages.needTime
-未将中间结果推进到其父级的工作周期数executionStages.needYield
-存储层要求查询系统产生的锁的次数executionStages.isEOF
-指定执行阶段是否已到达流结束
queryPlanner.allPlansExecution
-包含在计划选择阶段期间捕获的部分执行信息,包括选择计划和拒绝计划
serverInfo,
(服务器信息):MongoDB实例的相关信息:serverInfo.winningPlan
-使用的执行计划winningPlan.shards
-包括每个访问片的queryPlanner
和serverInfo
的文档数组
3. explain()
使用示例
有一个users
集合,现查询其'status'
值为'1'的数据,并查看执行情况:
> db.users.find({status:1}).explain() { "cursor" : "BasicCursor", "isMultiKey" : false, "n" : 1, "nscannedObjects" : 1, "nscanned" : 1, "nscannedObjectsAllPlans" : 1, "nscannedAllPlans" : 1, "scanAndOrder" : false, "indexOnly" : false, "nYields" : 0, "nChunkSkips" : 0, "millis" : 9, "server" : "localhost:27017", "filterSet" : false }