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

相关推荐
python_tty2 小时前
mongodb详解二:基础操作
python·mongodb
betazhou3 小时前
oracle goldengate from mongodb to oracle的实时同步
数据库·mongodb·oracle
python_tty3 小时前
mac 安装mongodb
数据库·mongodb·macos
V胡桃夹子4 小时前
MongoDB单机版安装
数据库·mongodb
来恩10034 小时前
MongoDB 学习指南与资料分享
数据库·mongodb
晓风残月Yuperman4 小时前
Windows 上安装 MongoDB 的 zip 包
数据库·mongodb
yuanpan1 天前
MongoDB中游标的使用
数据库·mongodb
FAFU_kyp1 天前
docker 安装mongodb
mongodb·docker·容器
Austindatabases1 天前
MongoDB 学习建模与设计思路--统计数据更新案例
数据库·学习·mongodb