---

title: MongoDB索引与查询优化实战

keywords:

  • MongoDB
  • 复合索引
  • 覆盖查询
  • 部分索引
  • TTL索引
  • explain
  • WiredTiger
  • 连接池
  • 聚合管道
  • 高基数

description: 通过复合与部分索引、覆盖查询与管道优化提升 MongoDB 性能,并以 explain/指标验证策略效果。

date: 2025-11-25

tags:

  • MongoDB
  • TTL索引
  • WiredTiger
  • explain
  • 后端
  • 复合索引
  • 技术
  • 数据库
  • 聚合管道
  • 覆盖查询
  • 连接池
  • 部分索引
  • 高基数

categories:

  • 文章资讯
  • 技术教程

---

概述

MongoDB 的查询性能高度依赖于索引与数据模型。本文提供常用优化策略与已验证的参数建议,帮助稳定提升读写性能。

索引策略(已验证)

  • 复合索引:按查询条件与排序组合创建,如 { status: 1, ts: -1 }
  • 覆盖查询:确保返回列包含在索引中,避免回表(projection 精简字段)。
  • 部分索引:对活跃子集加索引,降低写入开销,如 { status: 'active' }
  • TTL 索引:对过期数据自动删除,降低存储与查询压力。

查询与聚合

  • 使用 explain('executionStats') 观察扫描文档数与索引使用情况。
  • 聚合管道中尽量前置 $match$project,减少后续阶段处理量。
  • 谨慎使用 $regex 与前缀匹配;必要时结合 text 索引与权重。

连接与资源

  • 连接池:合理设置 maxPoolSize 并监控等待时间;
  • WiredTiger 缓存:关注缓存命中率与脏页;
  • 写入策略:批量写入与合并更新减少锁竞争。

示例

// 复合索引与查询示例
db.orders.createIndex({ status: 1, ts: -1 })
db.orders.find({ status: 'active' }).sort({ ts: -1 }).limit(100)

// 部分索引
db.users.createIndex({ email: 1 }, { partialFilterExpression: { verified: true } })

// TTL 索引(过期字段为日期)
db.sessions.createIndex({ expireAt: 1 }, { expireAfterSeconds: 0 })

// explain
db.orders.find({ status: 'active' }).sort({ ts: -1 }).limit(100).explain('executionStats')

验证与监控

  • 指标:查询耗时、扫描文档数、命中索引率;
  • 慢查询日志:分析 TopN 与模式;
  • 资源:连接池等待、缓存命中与 I/O;

常见误区

  • 对所有可能字段建立索引导致写入退化与膨胀;
  • 忽略排序字段导致排序回表与内存开销;
  • 过度依赖正则文本匹配,未使用合适的索引与投影。

结语

通过合理的索引与聚合管道设计,并以 explain 与监控验证,MongoDB 能在复杂场景中实现稳定与高效的查询性能。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部