# 概述 MongoDB 的查询性能高度依赖于索引与数据模型。本文提供常用优化策略与已验证的参数建议,帮助稳定提升读写性能。 # 索引策略(已验证) - 复合索引:按查询条件与排序组合创建,如 `{ status: 1, ts: -1 }`。 - 覆盖查询:确保返回列包含在索引中,避免回表(`projection` 精简字段)。 - 部分索引:对活跃子集加索引,降低写入开销,如 `{ status: 'active' }`。 - TTL 索引:对过期数据自动删除,降低存储与查询压力。 # 查询与聚合 - 使用 `explain('executionStats')` 观察扫描文档数与索引使用情况。 - 聚合管道中尽量前置 `$match` 与 `$project`,减少后续阶段处理量。 - 谨慎使用 `$regex` 与前缀匹配;必要时结合 `text` 索引与权重。 # 连接与资源 - 连接池:合理设置 `maxPoolSize` 并监控等待时间; - WiredTiger 缓存:关注缓存命中率与脏页; - 写入策略:批量写入与合并更新减少锁竞争。 # 示例 ```javascript // 复合索引与查询示例 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 能在复杂场景中实现稳定与高效的查询性能。

发表评论 取消回复