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
: 操作类型(如query
或update
)。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 }
从上面可以看出:
planSummary
是COLLSCAN
,表示查询没有使用索引。docsExamined
是 3000000,表示扫描了所有文档。- 查询耗时
120ms
。
优化方向:
- 为查询字段建立索引,改进查询计划为
IXSCAN
。
6. 使用 MongoDB Atlas(可选)
如果你在 MongoDB Atlas 中托管数据库,Profiler 已集成为 Performance Advisor,界面化显示慢查询数据,并自动推荐索引优化。
7. 注意事项
-
生产环境 :启用
level=2
的 Profiler 会对性能造成影响,仅建议在开发或测试环境使用。 -
日志存储大小 :
system.profile
数据默认存储在数据库文件中,占用磁盘空间。如果不需要长期保留,可以定期清理:javascript
复制编辑
db.system.profile.drop();
通过 Profiler,你可以深入了解查询性能,找到瓶颈,优化查询效率!