详情

首页手游攻略 MongoDB分析查询性能的步骤和代码示例实用指南

MongoDB分析查询性能的步骤和代码示例实用指南

佚名 2026-09-01 18:10:01

平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“MongoDB分析查询性能的步骤和代码示例”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。

目录
  • 1. 采用explain命令
    • 示例:基本explain采用
    • 输出示例及解读
  • 2. 采用 MongoDB Profiler
    • 启用 Profiler
    • 查询 Profiler 数据
    • 关闭 Profiler
    • 示例输出
  • 3. 采用db.currentOp()命令
    • 示例:查看当前操作
    • 示例输出
  • 4. 采用 Index Usage Statistics
    • 示例:查看索引采用情况
    • 示例输出
  • 总结

    从实现思路看,分析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数据库查询性能提高40倍的经历分享
    • MongoDB查询性能优化验证及验证
    • 1亿条记录的MongoDB数据库随机查询性能测试

    相关资讯
    点击查看更多
    游戏推荐
    推荐专题
    热门阅读
    推荐下载