跳到主要内容

MongoDB 慢查询分析

基于 MongoDB profiler 自动识别慢查询并给出索引优化建议,入口在「资源监控 → MongoDB」的慢查询页签。

前提
  • 被诊断的 MongoDB 需在数据源页添加并启用,且用途勾选慢查询诊断
  • 多个启用诊断的实例(如分片集群的多个分片)会自动聚合分析,无需额外配置。

工作原理

  1. 采集:平台周期性从 MongoDB system.profile 拉取慢查询记录(需已开 profiler)。
  2. 分组:按 query shape(忽略具体参数值的查询模板)聚合,每组显示累计次数、平均 / 最长耗时、扫描与返回文档数、典型样例。
  3. 索引建议:结合查询字段组合与现有索引,给出可创建的复合索引,支持一键创建(后台调用 createIndex)。

启用 profiler

列表为空时,先在每个被监控库开启 profiler(slowms 为慢查询阈值,生产建议 100~500ms):

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 })

注意事项

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