当MongoDB出现COLLSCAN频繁、CPU飙高时,需立即定位低效查询并创建精准索引:先用db.currentOp()和explain("executionStats")识别全表扫描,再按查询字段顺序生成createIndex()命令,最后在低峰期验证上线。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

当MongoDB查询响应变慢、CPU持续飙高,而explain()显示 COLLSCAN(全表扫描)频繁出现时,说明索引已失效或缺失,必须立即干预。
定位低效查询与缺失索引
在MongoDB Shell中执行 db.currentOp({ "secs_running": { "$gt": 3 } }),找出运行超3秒的活跃操作;重点关注 query 字段内容和 secs_running 值。
对每个可疑查询,用 explain("executionStats") 包裹执行:例如 db.orders.find({ status: "pending", created_at: { $gt: ISODate("2026-05-01") } }).explain("executionStats")。
检查返回中的 executionStats.executionStages.stage:若为 COLLSCAN,且 nReturned 远小于 totalDocsExamined,说明该查询完全未走索引。
注意:不要只看 indexName 是否为空——有些复合索引可能“部分命中”,但因字段顺序错误导致实际未生效。
生成精准索引建议
将上一步中确认的低效查询条件(如 { status: "pending", created_at: { $gt: ... } })整理成 JSON 格式,粘贴进 ChatGPT,并明确提示:“请为 MongoDB 7.0 输出一条 createIndex() 命令,要求覆盖所有查询字段,严格按查询中字段出现顺序排列,升序优先,不添加任何解释。”
ChatGPT 会返回类似 db.orders.createIndex({ status: 1, created_at: 1 }) 的命令——这个顺序不能调换,否则 { created_at: { $gt: ... } } 单独查询仍无法使用该索引。
如果查询含数组字段(如 tags: "mongodb"),需额外要求 ChatGPT 加入 多键索引标识,否则它默认输出普通索引,对数组查询无效。
验证并上线索引
第一步:在测试库执行索引创建命令,等待 db.orders.getIndexes() 中出现新条目。
第二步:用相同查询再次运行 explain("executionStats"),确认 executionStages.stage 变为 IXSCAN,且 totalDocsExamined ≈ nReturned。
第三步:在生产库执行相同命令;【务必在业务低峰期操作,且禁止在副本集主节点写入高峰期创建大索引】,否则可能触发长达数分钟的主从延迟甚至连接中断。
第四步:观察 mongostat 中 idx miss 和 qr|qw 指标是否同步下降——下降即生效。



















