如何在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,你可以深入了解查询性能,找到瓶颈,优化查询效率!

相关推荐
杨云龙UP21 小时前
Docker 部署 MongoDB 6.0 数据库每日自动备份实践:本地 + 异地保留 7 天_20260429
linux·运维·数据库·mongodb·docker·容器·centos
稳联技术老娜1 天前
Profinet转EtherCAT网关通讯架构及EtherCAT超距故障解决原理
mongodb
别来无恙blwy2 天前
windows MongoDB升级-自动升级脚本-自动检测升级到任意版本
数据库·windows·mongodb
snow@li2 天前
数据库-MongoDB:常用语法 / MongoDB 核心知识技能梳理
数据库·mongodb
刘晨鑫16 天前
MongoDB数据库应用
数据库·mongodb
爬山算法7 天前
MongoDB(92)什么是变更流(Change Streams)?
数据库·mongodb
小冯不疯7 天前
旺店通与金蝶云星空入库单管理对接方案
mongodb
MongoDB 数据平台7 天前
为编码代理引入 MongoDB 代理技能和插件
数据库·mongodb
忍冬行者7 天前
MongoDB 三节点副本集离线部署运维手册
运维·数据库·mongodb
卢傢蕊8 天前
MongoDB
数据库·mongodb