MongoDB使用explain命令的步骤和代码示例

 更新时间:2026年03月26日 10:18:32   作者:Victor356  
使用MongoDB的explain 命令可以深入了解查询的执行计划,从而帮助你优化和调试查询性能,下面是详细的步骤和代码示例,展示如何使用 explain 命令深入分析查询,感兴趣的朋友跟随小编一起看看吧

使用 MongoDB 的 explain 命令可以深入了解查询的执行计划,从而帮助你优化和调试查询性能。下面是详细的步骤和代码示例,展示如何使用 explain 命令深入分析查询。

1. 基本使用

最基本的 explain 命令可以提供查询的执行计划。

示例:基本explain使用

db.students.find({ studentId: 12345 }).explain();

2. explain() 的模式

explain 命令有三种模式:

  • queryPlanner: 返回查询的逻辑计划和索引使用情况。
  • executionStats: 返回查询的逻辑计划、索引使用情况以及执行统计信息。
  • allPlansExecution: 返回查询的逻辑计划、所有备选计划以及每个计划的执行统计信息。

示例:不同模式的explain

// queryPlanner 模式
db.students.find({ studentId: 12345 }).explain("queryPlanner");
// executionStats 模式
db.students.find({ studentId: 12345 }).explain("executionStats");
// allPlansExecution 模式
db.students.find({ studentId: 12345 }).explain("allPlansExecution");

3. explain() 输出解读

示例输出(executionStats 模式)

{
  "queryPlanner": {
    "plannerVersion": 1,
    "namespace": "school.students",
    "indexFilterSet": false,
    "parsedQuery": { "studentId": { "$eq": 12345 } },
    "winningPlan": {
      "stage": "FETCH",
      "inputStage": {
        "stage": "IXSCAN",
        "keyPattern": { "studentId": 1 },
        "indexName": "studentId_1",
        "direction": "forward",
        "indexBounds": { "studentId": [ "[12345, 12345]" ] }
      }
    },
    "rejectedPlans": []
  },
  "executionStats": {
    "executionSuccess": true,
    "nReturned": 1,
    "executionTimeMillis": 2,
    "totalKeysExamined": 1,
    "totalDocsExamined": 1,
    "executionStages": {
      "stage": "FETCH",
      "nReturned": 1,
      "executionTimeMillisEstimate": 0,
      "works": 2,
      "advanced": 1,
      "needTime": 0,
      "needYield": 0,
      "saveState": 0,
      "restoreState": 0,
      "isEOF": 1,
      "invalidates": 0,
      "docsExamined": 1,
      "alreadyHasObj": 0,
      "inputStage": {
        "stage": "IXSCAN",
        "nReturned": 1,
        "executionTimeMillisEstimate": 0,
        "works": 2,
        "advanced": 1,
        "needTime": 0,
        "needYield": 0,
        "saveState": 0,
        "restoreState": 0,
        "isEOF": 1,
        "invalidates": 0,
        "keyPattern": { "studentId": 1 },
        "indexName": "studentId_1",
        "isMultiKey": false,
        "multiKeyPaths": { "studentId": [] },
        "indexBounds": { "studentId": [ "[12345, 12345]" ] },
        "keysExamined": 1,
        "seeks": 1,
        "dupsTested": 0,
        "dupsDropped": 0
      }
    }
  },
  "serverInfo": {
    "host": "localhost",
    "port": 27017,
    "version": "4.4.6",
    "gitVersion": "22c124145fa3bfdaeafb3f6d1b5f3d4e8391fe86"
  }
}

关键字段解读

  • queryPlanner:
    • namespace: 查询的命名空间,即数据库和集合的名称。
    • parsedQuery: MongoDB 解析后的查询条件。
    • winningPlan: 查询的执行计划,包括使用的索引和操作步骤。
    • rejectedPlans: 被拒绝的其他执行计划。
  • executionStats:
    • executionSuccess: 查询是否成功。
    • nReturned: 查询返回的文档数量。
    • executionTimeMillis: 查询的执行时间(毫秒)。
    • totalKeysExamined: 扫描的索引键数量。
    • totalDocsExamined: 扫描的文档数量。数字越小越好。
    • executionStages: 查询的执行步骤及其统计信息。
  • executionStages:
    • stage: 执行阶段名称,例如FETCH, IXSCAN
    • nReturned: 该阶段返回的文档数量。
    • executionTimeMillisEstimate: 该阶段的估计执行时间。
    • keysExamined: 该阶段扫描的索引键数量。
    • docsExamined: 该阶段扫描的文档数量。
    • inputStage: 下一个输入阶段的信息。

4. 示例:复合索引和多条件查询

假设有一个复合索引 { lastName: 1, firstName: 1 },并执行多条件查询。

创建复合索引

db.students.createIndex({ lastName: 1, firstName: 1 });

查询及执行计划分析

db.students.find({ lastName: "Smith", firstName: "John" }).explain("executionStats");

示例输出及解读

{
  "queryPlanner": {
    "plannerVersion": 1,
    "namespace": "school.students",
    "indexFilterSet": false,
    "parsedQuery": { "lastName": { "$eq": "Smith" }, "firstName": { "$eq": "John" } },
    "winningPlan": {
      "stage": "FETCH",
      "inputStage": {
        "stage": "IXSCAN",
        "keyPattern": { "lastName": 1, "firstName": 1 },
        "indexName": "lastName_1_firstName_1",
        "direction": "forward",
        "indexBounds": {
          "lastName": [ "[\"Smith\", \"Smith\"]" ],
          "firstName": [ "[\"John\", \"John\"]" ]
        }
      }
    },
    "rejectedPlans": []
  },
  "executionStats": {
    "executionSuccess": true,
    "nReturned": 1,
    "executionTimeMillis": 1,
    "totalKeysExamined": 1,
    "totalDocsExamined": 1,
    "executionStages": {
      "stage": "FETCH",
      "nReturned": 1,
      "executionTimeMillisEstimate": 0,
      "works": 2,
      "advanced": 1,
      "needTime": 0,
      "needYield": 0,
      "saveState": 0,
      "restoreState": 0,
      "isEOF": 1,
      "invalidates": 0,
      "docsExamined": 1,
      "alreadyHasObj": 0,
      "inputStage": {
        "stage": "IXSCAN",
        "nReturned": 1,
        "executionTimeMillisEstimate": 0,
        "works": 2,
        "advanced": 1,
        "needTime": 0,
        "needYield": 0,
        "saveState": 0,
        "restoreState": 0,
        "isEOF": 1,
        "invalidates": 0,
        "keyPattern": { "lastName": 1, "firstName": 1 },
        "indexName": "lastName_1_firstName_1",
        "isMultiKey": false,
        "multiKeyPaths": { "lastName": [], "firstName": [] },
        "indexBounds": {
          "lastName": [ "[\"Smith\", \"Smith\"]" ],
          "firstName": [ "[\"John\", \"John\"]" ]
        },
        "keysExamined": 1,
        "seeks": 1,
        "dupsTested": 0,
        "dupsDropped": 0
      }
    }
  }
}

通过以上示例和解读,您可以深入了解 MongoDB 查询的执行计划,并根据执行计划中的信息优化查询和索引设计。合理使用 explain 命令,可以显著提升查询性能,确保数据库的高效运行。

到此这篇关于MongoDB使用explain命令的文章就介绍到这了,更多相关MongoDB使用explain命令内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一文搞懂Scrapy与MongoDB交互过程

    一文搞懂Scrapy与MongoDB交互过程

    这篇文章主要介绍了Scrapy与MongoDB交互过程,文末给大家介绍了类方法@classmethod的相关知识,需要的朋友可以参考下
    2022-07-07
  • 详解Mongodb 多文档聚合操作处理方法(Map-reduce 函数)

    详解Mongodb 多文档聚合操作处理方法(Map-reduce 函数)

    这篇文章主要介绍了Mongodb多文档聚合操作处理方法(Map-reduce函数),本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • Spring Boot中使用MongoDB数据库的方法

    Spring Boot中使用MongoDB数据库的方法

    MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大
    2018-02-02
  • MongoDB中的加减乘除运算详解

    MongoDB中的加减乘除运算详解

    这篇文章主要给大家介绍了关于MongoDB中加减乘除运算的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • mongodb 数据块的迁移流程分析

    mongodb 数据块的迁移流程分析

    这篇文章主要介绍了mongodb 数据块的迁移流程介绍,包括数据块迁移对集群性能的影响,建议设置平衡器的活跃时间窗口,设置为业务低估时进行,具体操作步骤文中有介绍,需要的朋友可以参考下
    2022-04-04
  • Mongodb实现的关联表查询功能【population方法】

    Mongodb实现的关联表查询功能【population方法】

    这篇文章主要介绍了Mongodb实现的关联表查询功能,结合实例形式较为详细的分析了population方法实现关联表查询的原理与相关操作技巧,需要的朋友可以参考下
    2017-07-07
  • MongoDB数据库中索引和explain的使用教程

    MongoDB数据库中索引和explain的使用教程

    这篇文章主要给大家介绍了关于MongoDB数据库中索引和explain使用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Mongodb具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。
    2017-08-08
  • MongoDB教程之查询操作实例

    MongoDB教程之查询操作实例

    这篇文章主要介绍了MongoDB教程之查询操作实例,本文讲解了基本查询、查询条件、null数据类型的查询、正则查询、数组数据查询、内嵌文档查询等数据查询技巧,需要的朋友可以参考下
    2015-05-05
  • SpringBoot系列之MongoDB Aggregations用法详解

    SpringBoot系列之MongoDB Aggregations用法详解

    MongoDB 中使用聚合(Aggregations)来分析数据并从中获取有意义的信息,本文重点给大家介绍SpringBoot系列之MongoDB Aggregations用法,感兴趣的朋友跟随小编一起看看吧
    2022-02-02
  • MongoDB快速翻页的方法

    MongoDB快速翻页的方法

    这篇文章主要为大家详细介绍了MongoDB快速翻页的方法,通过实例学习在MongoDB中翻阅数据的不同方式,感兴趣的小伙伴们可以参考一下
    2016-05-05

最新评论