it编程 > 数据库 > mongodb

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

55人参与 2026-03-26 mongodb

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

1. 基本使用

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

示例:基本explain使用

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

2. explain() 的模式

explain 命令有三种模式:

示例:不同模式的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"
  }
}

关键字段解读

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命令内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

MongoDB分析查询性能的步骤和代码示例

03-26

MongoDB在分片集群中添加新分片的操作方法

03-25

MongoDB使用索引优化查询的方法

03-25

MongoDB监控分片集群的操作方法

03-24

在MongoDB中使用多文档事务的详细步骤

04-07

MongoDB事务的限制和注意事项详解

04-07

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论