·更新于 2026年4月21日· 114 次浏览 MongoDB数据库
MongoDB 索引设计:从 IXSCAN 到覆盖查询
复合索引字段顺序、等值/范围/排序如何影响执行计划;何时出现 `COLLSCAN`,如何用 `hint` 与 `explain` 验证。
作者
ZHOU YI
B-Tree 索引在 MongoDB 中用于加速查找与排序。复合索引 (a:1, b:1, c:1) 遵循「最左前缀」:仅有 b、c 条件的查询往往无法使用该索引。
常见模式
- 高选择性字段靠前,范围查询字段尽量靠后
- 若查询常带
status + createdAt且按时间排序,可考虑{ status: 1, createdAt: -1 } - 覆盖查询:投影字段均在索引内且无需回表,可显著降低随机读
js
// 在 shell / Compass 中查看 winningPlan
db.orders.find({ userId: 1, status: 'paid' })
.sort({ createdAt: -1 })
.explain('executionStats')写入代价
每多一个索引都会增加插入/更新/删除的维护成本。对写多读少的集合要克制建索引,定期用 db.collection.aggregate([{ $indexStats: {} }]) 观察使用率。