MongoDB Explain() 解析
导言
在使用 MongoDB 进行查询操作时,我们常常需要对查询语句进行优化,以提升查询性能。而 MongoDB 提供了 explain() 方法,能够帮助我们深入了解查询的执行计划,从而进行必要的优化。
本文将详细介绍 explain() 方法的使用方法和结果解析,帮助读者更好地理解和使用 explain() 方法进行查询优化。
什么是 explain() 方法
在 MongoDB 中,explain() 方法是用于展示查询的执行计划的函数。通过该方法,我们可以获取到查询语句的执行计划,包括索引使用情况、查询阶段等信息。
使用 explain() 方法
要使用 explain() 方法,我们需要在查询语句前加上 explain() 方法,并将其作为一个独立的语句执行。
以下是 explain() 方法的基本语法:
db.collection.explain().find(query)
其中,db.collection.explain() 表示对该查询进行执行计划解析,find(query) 表示我们要执行的查询语句。
explain() 结果解析
explain() 方法的返回结果是一个包含执行计划信息的文档。下面是一个示例的执行计划文档:
{
"queryPlanner": {
"plannerVersion": 1,
"namespace": "mydb.collection",
"indexFilterSet": false,
"parsedQuery": {
"age": {
"$gt": 18
}
},
"winningPlan": {
"stage": "COLLSCAN",
"filter": {
"age": {
"$gt": 18
}
},
"direction": "forward"
},
"rejectedPlans": []
},
"executionStats": {
"executionSuccess": true,
"nReturned": 100,
"executionTimeMillis": 10,
"totalKeysExamined": 0,
"totalDocsExamined": 1000,
"executionStages": {
"stage": "COLLSCAN",
"filter": {
"age": {
"$gt": 18
}
},
"nReturned": 100,
"executionTimeMillisEstimate": 10,
"works": 1001,
"advanced": 100,
"needTime": 900,
"needYield": 0,
"saveState": 7,
"restoreState": 7,
"isEOF": 1,
"direction": "forward",
"docsExamined": 1000
}
},
"serverInfo": {
// 服务器信息
},
"ok": 1
}
explain() 方法的返回结果包含了 queryPlanner,executionStats 和 serverInfo 等字段。其中,queryPlanner 字段描述了查询的执行计划,executionStats 字段包含了执行统计信息,serverInfo 字段记录了服务器的相关信息。
queryPlanner 字段
queryPlanner 字段描述了查询的执行计划。在执行计划中,我们可以了解到索引的使用情况、查询阶段的顺序等信息。
executionStats 字段
executionStats 字段包含了执行统计信息。在执行统计信息中,我们可以了解到查询的执行时间、返回的文档数量、扫描的键数量等信息。
serverInfo 字段
serverInfo 字段记录了服务器的相关信息,如服务器版本、操作系统等。
解析 explain() 结果
在使用 explain() 方法时,我们主要关注 queryPlanner 和 executionStats 字段的内容。下面将详细介绍这两个字段的含义和解析方法。
解析 queryPlanner
queryPlanner 字段中的 winningPlan 表示了 MongoDB 认为最优的查询计划。
在 winningPlan 中,我们可以了解到查询使用了哪些索引、索引的选择顺序、过滤条件等信息。
以下是一个示例的 winningPlan:
"winningPlan": {
"stage": "COLLSCAN",
"filter": {
"age": {
"$gt": 18
}
},
"direction": "forward"
}
在上述示例中,stage 字段表示查询阶段,这里是 `COLLSCAN
















