MongoDB 查看执行计划

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() 我们就说到这里,小伙伴们有问题欢迎留言讨论。

参考资料:

  1. 《MongoDB权威指南第2版》
  2. MongoDB执行计划获取(db.collection.explain())
  3. mongodb .explain(‘executionStats’) 查询性能分析(没找到原文出处)

喜欢这篇文章吗?扫码关注公众号【江南一点雨】【江南一点雨】专注于 SPRING BOOT+微服务以及前后端分离技术,每天推送原创技术干货,关注后回复 JAVA,领取松哥为你精心准备的 JAVA 干货!

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×