简介
MongoDB的 explain() 函数可以帮助我们查看查询相关的信息,这有助于快速定位查询瓶颈。
基本用法
基本命令
db.dev.find({name:/^zhang/, age:{$gt:15}}).explain()
直接跟在 find() 函数后面,表示查看 find() 函数的执行计划,结果如下:
{ "queryPlanner" : { "plannerVersion" : 1, "namespace" : "xwj_db.dev", "indexFilterSet" : false, "parsedQuery" : { "$and" : [ { "age" : { "$gt" : 15.0 } }, { "name" : { "$regex" : "^zhang" } } ] }, "queryHash" : "ADEBB940", "planCacheKey" : "5F8D7E6C", "winningPlan" : { "stage" : "FETCH", "filter" : { "age" : { "$gt" : 15.0 } }, "inputStage" : { "stage" : "IXSCAN", "keyPattern" : { "name" : 1.0 }, "indexName" : "idx_name", "isMultiKey" : false, "multiKeyPaths" : { "name" : [] }, "isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : { "name" : [ "[\"zhang\", \"zhanh\")", "[/^zhang/, /^zhang/]" ] } } }, "rejectedPlans" : [] }, "serverInfo" : { "host" : "mongo", "port" : 27017, "version" : "4.2.11", "gitVersion" : "ea38428f0c6742c7c2c7f677e73d79e17a2aab96" }, "ok" : 1.0 }
返回结果包含两大块信息:一个是 queryPlanner,即查询计划,还有一个是serverInfo,即MongoDB服务的一些信息。
查询计划 queryPlanner 中,参数比较多,挑几个比较重要的参数说明下:
| 参数 | 含义 |
| plannerVersion | 查询计划版本 |
| namespace | 要查询的集合 |
| indexFilterSet | 是否应用了index filter |
| parsedQuery | 查询条件 |
| winningPlan | 最佳执行计划 |
| winningPlan.stage |
查询方式,常见的有: COLLSCAN/全表扫描、IXSCAN/索引扫描、FETCH/根据索引去检索文档、 SHARD_MERGE/合并分片结果、IDHACK/针对_id进行查询、SORT/在内存中进行排序 |
| winningPlan.filter | 过滤条件 |
| winningPlan.inputStage.keyPattern | 索引规则。这里是name正序 |
| winningPlan.inputStage.indexName | 索引名称 |
| winningPlan.inputStage.isMultiKey | 本次查询是否使用了多键、复合索引 |
| winningPlan.inputStage.direction | 查询顺序:正序是forward,倒序是backward |
| winningPlan.inputStage.direction | 所扫描的索引范围 |
参数