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() 方法的返回结果包含了 queryPlannerexecutionStatsserverInfo 等字段。其中,queryPlanner 字段描述了查询的执行计划,executionStats 字段包含了执行统计信息,serverInfo 字段记录了服务器的相关信息。

queryPlanner 字段

queryPlanner 字段描述了查询的执行计划。在执行计划中,我们可以了解到索引的使用情况、查询阶段的顺序等信息。

executionStats 字段

executionStats 字段包含了执行统计信息。在执行统计信息中,我们可以了解到查询的执行时间、返回的文档数量、扫描的键数量等信息。

serverInfo 字段

serverInfo 字段记录了服务器的相关信息,如服务器版本、操作系统等。

解析 explain() 结果

在使用 explain() 方法时,我们主要关注 queryPlannerexecutionStats 字段的内容。下面将详细介绍这两个字段的含义和解析方法。

解析 queryPlanner

queryPlanner 字段中的 winningPlan 表示了 MongoDB 认为最优的查询计划。

winningPlan 中,我们可以了解到查询使用了哪些索引、索引的选择顺序、过滤条件等信息。

以下是一个示例的 winningPlan

"winningPlan": {
  "stage": "COLLSCAN",
  "filter": {
    "age": {
      "$gt": 18
    }
  },
  "direction": "forward"
}

在上述示例中,stage 字段表示查询阶段,这里是 `COLLSCAN