MongoDB 中的 explain() 函数可以帮助我们查看查询相关的信息,这有助于我们快速查找到搜索瓶颈进而解决它,本文我们就来看看 explain() 的一些用法及其查询结果的含义。
本文是 MongoDB 系列的第八篇文章,了解前面的文章有助于更好的理解本文:
整体来说,explain() 的用法和 sort()、limit() 用法差不多,不同的是 explain() 必须放在最后面。
基本用法
先来看一个基本用法:
1
| db.sang_collect.find({x:1}).explain()
|
直接跟在 find() 函数后面,表示查看 find() 函数的执行计划,结果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| { "queryPlanner" : { "plannerVersion" : 1, "namespace" : "sang.sang_collect", "indexFilterSet" : false, "parsedQuery" : { "x" : { "$eq" : 1.0 } }, "winningPlan" : { "stage" : "COLLSCAN", "filter" : { "x" : { "$eq" : 1.0 } }, "direction" : "forward" }, "rejectedPlans" : [] }, "serverInfo" : { "host" : "localhost.localdomain", "port" : 27017, "version" : "3.4.9", "gitVersion" : "876ebee8c7dd0e2d992f36a848ff4dc50ee6603e" }, "ok" : 1.0 }
|
返回结果包含两大块信息,一个是 queryPlanner,即查询计划,还有一个是 serverInfo,即 MongoDB 服务的一些信息。那么这里涉及到的参数比较多,我们来一一看一下:
参数 |
含义 |
plannerVersion |
查询计划版本 |
namespace |
要查询的集合 |
indexFilterSet |
是否使用索引 |
parsedQuery |
查询条件,此处为x=1 |
winningPlan |
最佳执行计划 |
stage |
查询方式,常见的有**COLLSCAN/全表扫描、IXSCAN/索引扫描、FETCH/根据索引去检索文档、SHARD_MERGE/合并分片结果、IDHACK/针对1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| |filter|过滤条件| |direction|搜索方向| |rejectedPlans|拒绝的执行计划| |serverInfo|MongoDB服务器信息|
## 添加不同参数
explain() 也接收不同的参数,通过设置不同参数我们可以查看更详细的查询计划。
### queryPlanner
queryPlanner 是默认参数,添加 queryPlanner 参数的查询结果就是我们上文看到的查询结果,so,这里不再赘述。
### executionStats
executionStats 会返回最佳执行计划的一些统计信息,如下:
```json { "queryPlanner" : { "plannerVersion" : 1, "namespace" : "sang.sang_collect", "indexFilterSet" : false, "parsedQuery" : {}, "winningPlan" : { "stage" : "COLLSCAN", "direction" : "forward" }, "rejectedPlans" : [] }, "executionStats" : { "executionSuccess" : true, "nReturned" : 10000, "executionTimeMillis" : 4, "totalKeysExamined" : 0, "totalDocsExamined" : 10000, "executionStages" : { "stage" : "COLLSCAN", "nReturned" : 10000, "executionTimeMillisEstimate" : 0, "works" : 10002, "advanced" : 10000, "needTime" : 1, "needYield" : 0, "saveState" : 78, "restoreState" : 78, "isEOF" : 1, "invalidates" : 0, "direction" : "forward", "docsExamined" : 10000 } }, "serverInfo" : { "host" : "localhost.localdomain", "port" : 27017, "version" : "3.4.9", "gitVersion" : "876ebee8c7dd0e2d992f36a848ff4dc50ee6603e" }, "ok" : 1.0 }
|
|
这里除了我们上文介绍到的一些参数之外,还多了 executionStats 参数,含义如下:
参数 |
含义 |
executionSuccess |
是否执行成功 |
nReturned |
返回的结果数 |
executionTimeMillis |
执行耗时 |
totalKeysExamined |
索引扫描次数 |
totalDocsExamined |
文档扫描次数 |
executionStages |
这个分类下描述执行的状态 |
stage |
扫描方式,具体可选值与上文的相同 |
nReturned |
查询结果数量 |
executionTimeMillisEstimate |
预估耗时 |
works |
工作单元数,一个查询会分解成小的工作单元 |
advanced |
优先返回的结果数 |
docsExamined |
文档检查数目,与totalDocsExamined一致 |
allPlansExecution
allPlansExecution 用来获取所有执行计划,结果参数基本与上文相同,这里就不再细说了。
好了,MongoDB 中的 explain() 我们就说到这里,小伙伴们有问题欢迎留言讨论。
参考资料:
- 《MongoDB权威指南第2版》
- MongoDB执行计划获取(db.collection.explain())
- mongodb .explain(‘executionStats’) 查询性能分析(没找到原文出处)