如何在MongoDB中监视查询慢的语句

MongoDB Profiler 是一个强大的工具,用于监控和诊断查询性能问题,尤其是捕获慢查询。下面是一个详细的教程,教你如何使用 MongoDB Profiler:

1. 启用 MongoDB Profiler

MongoDB Profiler 的监控级别有以下几种:

  • 0: 不收集任何查询信息(默认)。
  • 1: 收集慢查询(超过指定时间的操作)。
  • 2: 收集所有操作(性能开销较大,慎用)。

在 MongoDB Shell 中启用 Profiler 的方法:

(1) 仅捕获慢查询
复制代码

javascript

复制编辑

db.setProfilingLevel(1, { slowms: 50 }); // 捕获耗时超过 50ms 的查询

(2) 捕获所有查询
复制代码

javascript

复制编辑

db.setProfilingLevel(2); // 捕获所有查询(调试阶段可用,生产环境慎用)

(3) 查看当前 Profiler 配置
复制代码

javascript

复制编辑

db.getProfilingStatus();

(4) 禁用 Profiler
复制代码

javascript

复制编辑

db.setProfilingLevel(0); // 关闭查询分析


2. 执行查询并捕获性能数据

在启用 Profiler 后,运行你的查询。慢查询或所有操作都会记录在 system.profile 集合中。

例如,运行以下查询:

复制代码

javascript

复制编辑

db.CollectionBigFile.find({ maxX: { $lte: 100 }, maxY: { $lte: 100 }, maxZ: { $lte: 100 }, minX: { $gte: 0 }, minY: { $gte: 0 }, minZ: { $gte: 0 } });


3. 查看 Profiler 捕获的数据

Profiler 收集的所有数据存储在 system.profile 集合中,可以直接查询:

(1) 查看最近的慢查询
复制代码

javascript

复制编辑

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

(2) 按执行时间过滤

找出耗时超过 100ms 的查询:

复制代码

javascript

复制编辑

db.system.profile.find({ millis: { $gt: 100 } }).pretty();

(3) 查看特定集合的查询记录

只查看 CollectionBigFile 集合的查询:

复制代码

javascript

复制编辑

db.system.profile.find({ ns: "yourDatabase.CollectionBigFile" }).pretty();


4. Profiler 数据的关键字段

system.profile 返回的文档中,关注以下字段:

  • op : 操作类型(如 queryupdate)。
  • ns: 命名空间(即数据库和集合名称)。
  • millis: 查询耗时(毫秒)。
  • query: 查询条件。
  • planSummary: 查询计划摘要(如是否使用了索引)。
  • keysExamined: 检查的索引键数量。
  • docsExamined: 扫描的文档数量。
  • execStats: 执行统计详情。

5. 示例:分析慢查询

假设 db.system.profile.find().pretty() 返回以下文档:

复制代码

javascript

复制编辑

{ "op" : "query", "ns" : "yourDatabase.CollectionBigFile", "query" : { "maxX" : { "$lte" : 100 }, "maxY" : { "$lte" : 100 }, "maxZ" : { "$lte" : 100 }, "minX" : { "$gte" : 0 }, "minY" : { "$gte" : 0 }, "minZ" : { "$gte" : 0 } }, "planSummary" : "COLLSCAN", // 表示使用了全表扫描 "keysExamined" : 0, "docsExamined" : 3000000, "millis" : 120 }

从上面可以看出:

  • planSummaryCOLLSCAN,表示查询没有使用索引。
  • docsExamined 是 3000000,表示扫描了所有文档。
  • 查询耗时 120ms

优化方向

  • 为查询字段建立索引,改进查询计划为 IXSCAN

6. 使用 MongoDB Atlas(可选)

如果你在 MongoDB Atlas 中托管数据库,Profiler 已集成为 Performance Advisor,界面化显示慢查询数据,并自动推荐索引优化。


7. 注意事项

  • 生产环境 :启用 level=2 的 Profiler 会对性能造成影响,仅建议在开发或测试环境使用。

  • 日志存储大小system.profile 数据默认存储在数据库文件中,占用磁盘空间。如果不需要长期保留,可以定期清理:

    复制代码

    javascript

    复制编辑

    db.system.profile.drop();

通过 Profiler,你可以深入了解查询性能,找到瓶颈,优化查询效率!

相关推荐
自由会客室16 小时前
Ubuntu24安装MongoDB7
数据库·mongodb
FinTech老王19 小时前
国产数据库替代MongoDB:政务电子证照新选择
mongodb·1024程序员节
武子康1 天前
Java-154 深入浅出 MongoDB 用Java访问 MongoDB 数据库 从环境搭建到CRUD完整示例
java·数据库·分布式·sql·mongodb·性能优化·nosql
码界奇点1 天前
MongoDB 排序操作详解sort方法使用指南
数据库·mongodb·性能优化
武子康1 天前
Java-155 MongoDB Spring Boot 连接实战 | Template vs Repository(含索引与常见坑)
java·数据库·spring boot·后端·mongodb·系统架构·nosql
武子康1 天前
Java-157 MongoDB 存储引擎 WiredTiger vs InMemory:何时用、怎么配、如何验证 mongod.conf
java·数据库·sql·mongodb·性能优化·系统架构·nosql
低音钢琴2 天前
【SpringBoot从初学者到专家的成长20】SpringBoot集成MongoDB:非关系型数据库的探索
spring boot·mongodb·nosql
点灯小铭2 天前
基于单片机的智能家居多参数环境监测与联动报警系统设计
单片机·mongodb·毕业设计·智能家居·课程设计·期末大作业
我的offer在哪里2 天前
MongoDB
数据库·mongodb