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

 更新时间:2026年03月26日 10:24:28   作者:Victor356  
MongoDB提供了许多工具和命令,用于详细分析查询的性能表现,下面给大家介绍MongoDB分析查询性能的步骤和代码示例,感兴趣的朋友跟随小编一起看看吧

分析MongoDB查询性能是确保应用程序高效运行的关键步骤。MongoDB提供了许多工具和命令,用于详细分析查询的性能表现。以下是详细的步骤和代码示例,展示如何分析MongoDB的查询性能。

1. 使用explain命令

explain 命令可以详细描述查询的执行计划,包括使用的索引、扫描的文档数量等。

示例:基本explain使用

db.students.find({ studentId: 12345 }).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"
  }
}

关键指标说明:

  • totalKeysExamined: 扫描的索引键数量。
  • totalDocsExamined: 扫描的文档数量。数字越小越好。
  • executionTimeMillis: 查询执行时间,单位是毫秒。
  • winningPlan: 使用的执行计划,包括使用的索引。

2. 使用 MongoDB Profiler

MongoDB Profiler 可以记录数据库操作和慢查询的详细信息。

启用 Profiler

db.setProfilingLevel(2);

查询 Profiler 数据

db.system.profile.find().sort({ ts: -1 }).limit(1).pretty();

关闭 Profiler

db.setProfilingLevel(0);

示例输出

{
  "op": "query",
  "ns": "school.students",
  "command": {
    "find": "students",
    "filter": { "studentId": 12345 },
    "projection": {},
    "sort": {}
  },
  "keysExamined": 1,
  "docsExamined": 1,
  "cursorExhausted": true,
  "numYield": 0,
  "locks": {
    "Global": { "acquireCount": { "r": 1 } },
    "Database": { "acquireCount": { "r": 1 } },
    "Collection": { "acquireCount": { "r": 1 } }
  },
  "nreturned": 1,
  "responseLength": 466,
  "millis": 2,
  "ts": ISODate("2021-07-20T14:45:14.467Z"),
  "client": "127.0.0.1",
  "appName": "MongoDB Shell",
  "allUsers": [],
  "user": ""
}

关键指标说明:

  • keysExamined, docsExamined: 这些指标与explain命令的输出类似。
  • millis: 查询执行时间,单位是毫秒。
  • nreturned: 返回的文档数量。

3. 使用db.currentOp()命令

db.currentOp() 可以查看当前正在运行的操作。

示例:查看当前操作

db.currentOp();

示例输出

{
  "inprog": [
    {
      "opid": 12345,
      "active": true,
      "secs_running": 2,
      "microsecs_running": NumberLong(2000000),
      "op": "query",
      "ns": "school.students",
      "query": { "studentId": 12345 },
      "client": "127.0.0.1:50731",
      "desc": "conn123",
      "threadId": "0x7fd4e7bfb700",
      "connectionId": 123,
      "waitingForLock": false,
      "lockStats": { "Global": { "acquireCount": { "r": NumberLong(1) } } }
    }
  ]
}

关键指标说明:

  • secs_running: 查询已运行的时间,单位是秒。
  • op: 当前正在执行的操作类型。
  • query: 正在执行的查询。

4. 使用 Index Usage Statistics

查看索引的使用情况,识别未使用的索引。

示例:查看索引使用情况

db.students.aggregate([
  { $indexStats: {} }
]);

示例输出

[
  {
    "name": "studentId_1",
    "key": { "studentId": 1 },
    "host": "localhost:27017",
    "accesses": {
      "ops": 123,
      "since": ISODate("2021-07-01T00:00:00Z")
    }
  }
]

关键指标说明:

  • name: 索引名称。
  • accesses.ops: 索引的访问次数。
  • accesses.since: 统计开始时间。

总结

通过上述方法,您可以详细分析MongoDB查询性能,并识别潜在的瓶颈和优化机会。关键工具和命令包括:

  • explain 命令,详细描述查询执行计划。
  • MongoDB Profiler,记录数据库操作和慢查询。
  • db.currentOp() 命令,查看当前正在运行的操作。
  • 索引使用统计,识别未使用的索引。

通过合理使用这些工具和方法,可以有效提高MongoDB查询的性能,从而确保数据库应用程序的高效运行。

到此这篇关于MongoDB分析查询性能的文章就介绍到这了,更多相关MongoDB分析查询性能内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MongoDB磁盘空间占满导致数据库被锁定的解决方法

    MongoDB磁盘空间占满导致数据库被锁定的解决方法

    我在实际项目中,遇到一个问题,随着数据每天的不断增加,导致mongodb的磁盘空间站满了,数据库被锁了,无法使用,所以本文给大家介绍了清理MongoDB数据和磁盘空间的方法,需要的朋友可以参考下
    2024-04-04
  • 十个提高MongoDB安全性的配置技巧

    十个提高MongoDB安全性的配置技巧

    这篇文章主要介绍了十个提高MongoDB安全性的配置技巧,需要的朋友可以参考下
    2014-10-10
  • MongoDB中如何使用JOIN操作详解

    MongoDB中如何使用JOIN操作详解

    相信大家都知道mongodb是不支持join操作的,因此我们只能自己来实现这个功能。所以下面这篇文章主要给大家介绍了关于在MongoDB中如何使用JOIN操作的相关资料,文中通过示例代码介绍的非常详细,需要的朋友们下面来一起看看吧。
    2017-07-07
  • mongodb实现数组对象求和方法实例

    mongodb实现数组对象求和方法实例

    这篇文章主要给大家介绍了关于mongodb实现数组对象求和的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • Windows下mongodb安装与配置三步走

    Windows下mongodb安装与配置三步走

    大家应该都知道mongodb是当下流行的非关系型数据库,特别是配合node使用,下面示范一下在Windows系统下如何安装和配置的,文中通过图文介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-03-03
  • Win10 64位安装MongoDB数据库的详细教程

    Win10 64位安装MongoDB数据库的详细教程

    这篇文章主要介绍了Win10 64位安装MongoDB数据库的详细教程,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • Ubuntu16.04手动安装MongoDB的详细教程

    Ubuntu16.04手动安装MongoDB的详细教程

    本篇文章主要介绍了Ubuntu16.04手动安装MongoDB的详细教程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • mongodb基础之用户权限管理实例教程

    mongodb基础之用户权限管理实例教程

    这篇文章主要给大家介绍了关于mongodb基础之用户权限管理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-06-06
  • MongoDB导出查询结果到文件例子

    MongoDB导出查询结果到文件例子

    这篇文章主要介绍了MongoDB导出查询结果到文件例子,本文直接给出示例代码,简洁易懂,需要的朋友可以参考下
    2015-02-02
  • MongoDB查询时区问题示例详解

    MongoDB查询时区问题示例详解

    MongoDB提供了灵活而强大的查询能力,让我们能够轻松地进行时间范围查询,这篇文章主要介绍了MongoDB查询时区问题的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-09-09

最新评论