跳到主要内容

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
  • 一键创建索引前请评估对写入性能的影响,必要时在低峰时段执行