一、概述
MongoDB中的explain()函数可以帮助我们查看查询相关的信息,查询分析可以确保我们创建的索引是否有效,是查询语句性能分析的重要工具。
二、explain()基本用法
explain()的用法是必须放在最后面,语法如下:
db.collecton.find({x:1}).explain()
explain()常用是直接跟在find()函数后面,表示查看find()函数的执行计划,举例:
MongoDB Enterprise mongos> db.emp.find({"id":{$lt:1000}}).explain()
{
"queryPlanner" : {
serverInfo" : {
"host" : "mongotest1",
"port" : 27021,
"version" : "3.2.8",
"gitVersion" : "ed70e33130c977bda0024c125b56d159573dbaf0"
},
"plannerVersion" : 1,
"namespace" : "testdb.emp",
"indexFilterSet" : false,
"parsedQuery" : {
"id" : {
"$lt" : 1000
}
},
winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "SHARDING_FILTER",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"id" : 1
},
"indexName" : "id_1",
"direction" : "forward",
},
"rejectedPlans" : [ ]
},
"ok" : 1
}
参数说明:
以上我们看到的是explain()默认参数的情况,其实MongoDB 3.0之后,explain的返回与使用方法与之前版本有了很大的变化,
3.0+版本的explain有三种模式,分别是:queryPlanner、executionStats、allPlansExecution。常用的是queryPlanner和executionStats模式
那我们再来看看executionStats这种模式
MongoDB Enterprise mongos> db.emp.find({"id":{$lt:1000}}).explain("executionStats")
{
"queryPlanner" : {
"mongosPlannerVersion" : 1,
"winningPlan" : {
"stage" : "SHARD_MERGE",
},
"rejectedPlans" : [ ]
},
"executionStats" : {
"nReturned" : 999,
"executionTimeMillis" : 35,
"totalKeysExamined" : 999,
"totalDocsExamined" : 999,
"executionStages" : {
"stage" : "SHARD_MERGE",
"nReturned" : 999,
"executionTimeMillis" : 35,
"totalKeysExamined" : 999,
"totalDocsExamined" : 999,
"totalChildMillis" : NumberLong(33),
"shards" : [
{
"shardName" : "shard1",
"executionSuccess" : true,
"executionStages" : {
"stage" : "FETCH",
"nReturned" : 980,
"executionTimeMillisEstimate" : 30,
"works" : 981,
"advanced" : 980,
"needTime" : 0,
"needYield" : 0,
"saveState" : 7,
"restoreState" : 7,
"isEOF" : 1,
"invalidates" : 0,
"docsExamined" : 980,
"alreadyHasObj" : 0
},
"ok" : 1
}
executionStats的参数说明:
在此看来,executionStats这种模式比默认的queryPlanner给出来个更多的可参考的信息,
另外一种模式allPlansExecution是用来获取所有执行计划,参数基本与以上的相同,这里就不再详细说明。
三、总结
原来explain()也是可以接收不同的参数,通过设置不同参数我们可以查看更详细的查询计划。
queryPlanner:查询计划的选择器,首先进行查询分析,最终选择一个winningPlan,是explain返回的默认模式
executionStats:为执行统计模式,返回winningPlan的统计结果
allPlansExecution:为返回所有执行计划的统计,包括rejectedPlan
所以:我们在查询优化的时候,只需要关注queryPlanner, executionStats即可,因为queryPlanner为我们选择出了winningPlan, 而executionStats为我们统计了winningPlan的所有关键数据。
整体来说,通过explain()查看执行计划,分析查询性能情况,可以帮助我们更好的分析和优化,必要的时候可以创建索引,提升查询性能。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。