·更新于 2026年4月21日· 114 次浏览 MongoDB数据库

MongoDB 索引设计:从 IXSCAN 到覆盖查询

复合索引字段顺序、等值/范围/排序如何影响执行计划;何时出现 `COLLSCAN`,如何用 `hint` 与 `explain` 验证。

MongoDB 索引设计:从 IXSCAN 到覆盖查询
ZHOU YI

作者

ZHOU YI

B-Tree 索引在 MongoDB 中用于加速查找与排序。复合索引 (a:1, b:1, c:1) 遵循「最左前缀」:仅有 bc 条件的查询往往无法使用该索引。

常见模式

  • 高选择性字段靠前,范围查询字段尽量靠后
  • 若查询常带 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: {} }]) 观察使用率。


Guestbook

留言

若这篇文章也曾停在你心上,留一行字吧,我会看的。

先确认一下邮箱

多这一步,是为了少些机器骚扰,也让我能更踏实地读每一条真人写下的字。验证码 10 分钟内有效;同一邮箱 60 秒内只能发一封。

本文留言

0已加载 0

这里还静悄悄的——愿意做第一个留下脚印的人吗?