MongoDB中的explain()函数能够帮助咱们查看查询相关的信息,这有助于咱们快速查找到搜索瓶颈进而解决它,本文咱们就来看看explain()的一些用法及其查询结果的含义。 html
本文是MongoDB系列的第八篇文章,了解前面的文章有助于更好的理解本文:git
1.Linux上安装MongoDB
2.MongoDB基本操做
3.MongoDB数据类型
4.MongoDB文档更新操做
5.MongoDB文档查询操做(一)
6.MongoDB文档查询操做(二)
7.MongoDB文档查询操做(三)mongodb
总体来讲,explain()的用法和sort()、limit()用法差很少,不一样的是explain()必须放在最后面。服务器
先来看一个基本用法:dom
db.sang_collect.find({x:1}).explain()
直接跟在find()函数后面,表示查看find()函数的执行计划,结果以下:函数
{ "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/针对_id 进行查询 |
filter | 过滤条件 |
direction | 搜索方向 |
rejectedPlans | 拒绝的执行计划 |
serverInfo | MongoDB服务器信息 |
explain()也接收不一样的参数,经过设置不一样参数咱们能够查看更详细的查询计划。spa
queryPlanner是默认参数,添加queryPlanner参数的查询结果就是咱们上文看到的查询结果,so,这里再也不赘述。.net
executionStats会返回最佳执行计划的一些统计信息,以下:rest
{ "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用来获取全部执行计划,结果参数基本与上文相同,这里就再也不细说了。
好了,MongoDB中的explain()咱们就说到这里,小伙伴们有问题欢迎留言讨论。
参考资料:
1.《MongoDB权威指南第2版》
2.MongoDB执行计划获取(db.collection.explain())
3.mongodb .explain('executionStats') 查询性能分析(没找到原文出处)
更多资料请关注公众号: