MongoDB 慢查询分析
运维平台基于 MongoDB profiler 自动识别慢查询并提供索引优化建议。
入口
左侧菜单「资源监控 → MongoDB」中的慢查询页签。
1.4.0 起
- 被诊断的 MongoDB 实例需在「数据源」页面添加并启用,且用途勾选慢查询诊断。
- 多个启用诊断的 MongoDB 实例(如分片集群的多个分片)会自动聚合分析,无需额外配置 。
工作原理
数据采集
- 运维平台周期性从 MongoDB 的
system.profile集合拉取慢查询记录(要求 profiler 已启用) - 默认采集执行时长超过 100ms 的查询,可在 MongoDB 端通过
db.setProfilingLevel(1, 100)调整阈值
慢查询分组
- 按 query shape(查询模板,忽略具体参数值)聚合
- 同一组下显示:累计次数、平均耗时、最长耗时、典型查询样例、扫描文档数、返回文档数
索引建议
- 基于查询条件中的字段组合 + MongoDB 现有索引情况,给出可创建的复合索引建议
- 支持「一键创建索引」,运维平台调用 MongoDB
createIndex命令在后台执行
启用 MongoDB profiler
如果列表为空,先在每个被监控的 MongoDB 节点开启 profiler:
// 对每个业务数据库执行
use mdwsrows
db.setProfilingLevel(1, { slowms: 100 })
use mdservicedata
db.setProfilingLevel(1, { slowms: 100 })
use mdworksheet
db.setProfilingLevel(1, { slowms: 100 })
use mdworkflow
db.setProfilingLevel(1, { slowms: 100 })
slowms 是慢查询阈值(毫秒),建议生产环境设 100~500ms。
注意事项
- profiler 本身有少量性能开销(约 1-3%),生产环境建议只采集 slowms 阈值以上的查询,不要用 level=2(全部采集)
- 慢查询数据保留在
system.profile集合,是 capped collection(默认 1MB),高 QPS 环境可能很快被滚动覆盖。可通过db.setProfilingLevel(0); db.system.profile.drop(); db.createCollection("system.profile", {capped: true, size: 100000000})扩到 100MB - 一键创建索引前请评估对写入性能的影响,必要时在低峰时段执行