在对MongoDB进行性能分析时, 需要使用explain命令, 以观察索引是否使用到, 扫描了多少文档等信息. MongoDB 3.0以后explain命令进行了更改, 参数以及输出格式发生了变化. 3.0以后传入一个字符串参数verbosity.
语法如下:
cursor.explain(verbosity)
其中verbosity代表显示的内容. 执行以下语句:
db.users.find({username:"user12345"}).explain(true)
如上, true表示全部显示. 一般包含executionStats,queryPlanner,serverInfo几个部分:
{
"executionStats" : {
"allPlansExecution" : [ ],
"executionStages" : {
"advanced" : 0,
"direction" : "forward",
"docsExamined" : 1000000,
"executionTimeMillisEstimate" : 270,
"filter" : {
"username" : {
"$eq" : "user12345" }
},
"invalidates" : 0,
"isEOF" : 1,
"nReturned" : 0,
"needTime" : 1000001,
"needYield" : 0,
"restoreState" : 7812,
"saveState" : 7812,
"stage" : "COLLSCAN",
"works" : 1000002
},
"executionSuccess" : true,
"executionTimeMillis" : 347,
"nReturned" : 0,
"totalDocsExamined" : 1000000,
"totalKeysExamined" : 0
},
"ok" : 1,
"queryPlanner" : {
"indexFilterSet" : false,
"namespace" : "test.users",
"parsedQuery" : {
"username" : {
"$eq" : "user12345"
}
},
"plannerVersion" : 1,
"rejectedPlans" : [ ],
"winningPlan" : {
"direction" : "forward",
"filter" : {
"username" : {
"$eq" : "user12345" }
},
"stage" : "COLLSCAN"
}
},
"serverInfo" : {
"gitVersion" : "79d9b3ab5ce20f51c272b4411202710a082d0317",
"host" : "ubuntu",
"port" : 27017,
"version" : "3.2.10"
}
}
verbosity可选的模式有”queryPlanner”, “executionStats”, 和 “allPlansExecution”.传入true代表allPlansExecution mode, 传入false或者默认为queryPlanner mode.
对aggregate()方法调用explain方法会忽略参数信息, 以queryPlanner mode执行.
queryPlanner Mode: MongoDB运行 query optimizer来获取最优的执行计划, 这个模式返回被评估的方法queryPlanner信息
executionStats Mode: MongoDB运行query optimizer来获取最优的执行计划, 然后执行这个计划, 并返回执行过程的信息.
对于写操作, db.collection.explain()方法会返回将要执行的update和delete操作的信息, 但是并不会将修改应用到数据库.
db.collection.explain()并不会返回rejected plan的query execution information.
allPlansExecution Mode: MongoDB运行query optimizer来选择winning plan, 并且执行这个计划. 在”allPlansExecution” 模式中, MongoDB会返回在plan selection中所有的candidate计划.
对于写操作, 同executionStats mode. 并不进行真正的更改操作.
这个方法返回被评估的方法的queryPlanner和executionStats信息. executionStats包含完整的winning query执行信息.
如果query optimizer阶段考虑了多个执行计划,那么executionStats还包含了在plan selection阶段的winning plan和rejected candidate plans的部分信息.
参考文档 : https://docs.mongodb.com/manual/reference/method/db.collection.explain/#explain-method-verbosity