当前位置: 首页 > article >正文

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


http://www.kler.cn/a/509371.html

相关文章:

  • 【人工智能】Python中的自动化机器学习(AutoML):如何使用TPOT优化模型选择
  • nuiapp在APP中的.nvue页面中使用webview展示空白的问题
  • Linux提权-02 sudo提权
  • SpringBoot错误码国际化
  • NodeJS | 搭建本地/公网服务器 live-server 的使用与安装
  • HarmonyOS NEXT应用开发边学边玩系列:从零实现一影视APP (三、影视搜索页功能实现)
  • 深入剖析Java线程安全的集合类:原理、特点与应用
  • 系统编程(进程通信--消息队列)
  • mfc操作json示例
  • Vulnhub-Tr0ll靶机笔记
  • MySql操作指南5--事务与并发控制
  • 2.1 使用kubectl部署一个简单的nginx-pod
  • 内存与缓存:保姆级图文详解
  • 上位机工作感想-2024年工作总结和来年计划
  • PyCharm中解决依赖冲突
  • ESP8266-01S、手机、STM32连接
  • [Computer Vision]实验一:图像的基本操作
  • 挖掘机检测数据集,准确识别率91.0%,4327张原始图片,支持YOLO,COCO JSON,PASICAL VOC XML等多种格式标注
  • Java中的深拷贝与浅拷贝探究(利用反射+泛型实现深拷贝工具类)
  • iOS - Objective-C 底层实现中的哈希表
  • UiPath发送嵌入图片HTML邮件
  • BGP联盟
  • 窗口门狗实验(WWDG)实验【学习】
  • 【高阶数据结构】位图(BitMap)
  • OSPF - 路由过滤的几种方法
  • C++/QT环境下图像在窗口下等比例渲染绘制