---
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 能在复杂场景中实现稳定与高效的查询性能。

发表评论 取消回复