章节摘要:索引是 MongoDB 用空间换查询时间的 B 树结构。本章从一次"三条查询拖垮整个集群"的事故讲起,覆盖索引原理、执行计划阅读、复合索引规则与常见失效写法。读完本章,你能用 explain 判断任何一条查询是否走索引,并设计出合理的复合索引。
金句:没有索引的查询不是慢,是让整台服务器陪着它把每个文档摸一遍。

3.1 解决"看得懂"——读懂执行计划;3.2 解决"改得对"——设计与维护索引。两节的连接件是三个数字:nReturned、totalKeysExamined、totalDocsExamined。3.1 教你看懂它们,3.2 的所有手段(ESR、部分索引、冗余清理)最终都体现为这三个数字的改善。反过来,离开这三个数字谈索引设计,就退回到口味之争。
看懂 explain(3.1) ──► 设计与维护(3.2) │ │ COLLSCAN 定位 ESR · 失效清单 · 冗余清理
本章还有一个贯穿性的提醒:索引问题从来不只是查询慢。档案 06 里它表现为整站停摆,第 7 章里它会以热点分片的形态出现,第 10 章里它又是缓存驱逐的帮凶——索引是 MongoDB 性能问题的第一嫌疑人,无论案情表面是什么。
离开本章前逐条自查:能否对着一条 explain 输出指出 COLLSCAN 与 IXSCAN 的位置;能否用 nReturned、totalKeysExamined、totalDocsExamined 三个数字判断索引效率,并说出理想比例;能否按 ESR 顺序为"查某城市最近三十天的已完成订单"设计复合索引;能否列出至少四种索引失效写法(隐式类型转换、前缀不确定的正则、跳过前导列的范围查询、条件放错位置);能否说清 hideIndex 与直接 dropIndex 在下线流程上的差别。卡住哪条,回对应小节的事故复盘再走一遍。
前置:第 2 章的查询语法。延伸:索引是性能三件套(索引、建模、硬件缓存)之一,另两件分别在第 5 章与第 10 章。