📖 1. 索引基础
-
默认索引:
_id
字段自带唯一索引。 -
单字段索引:对一个字段建索引。
-
复合索引:多个字段组合建索引。
-
多键索引:数组字段建索引(数组里的每个值都会建索引)。
-
唯一索引:字段值必须唯一。
-
TTL 索引:让数据过期自动删除(常用于日志、session)。
-
部分索引 / 稀疏索引:只索引符合条件的文档。
-
全文索引:支持文本搜索。
📖 2. 建索引语法
📖 3. 索引设计规范
✅ 基本原则
-
高频查询的字段必须建索引
-
比如
email
(登录用)、created_at
(分页用)、article_id
(查询文章评论)。
-
-
避免给低选择性字段建索引
-
如
gender
、status
(只有 0/1),建索引没意义,因为匹配结果太多,MongoDB 还是要全表扫描。
-
-
复合索引遵循“最左前缀原则”
-
索引
{a:1, b:1, c:1}
,支持:-
a
-
a, b
-
a, b, c
-
-
但不支持单独
b
或c
。
-
-
避免过多索引
-
每个索引会增加写入成本(insert/update/delete 都要更新索引)。
-
一般来说,一个 collection 不要超过 5–10 个索引。
-
-
区分排序和范围查询
-
如果有
range
(如age > 30
),后面的索引字段不能再用于排序。 -
所以复合索引要 carefully 按查询习惯设计。
-
-
考虑 TTL 和稀疏索引
-
日志/临时数据用 TTL;
-
可选字段(如
mobile
)用 sparse/partial index。
-
📖 4. 实战案例
案例 1:用户表
索引设计
-
登录查找 →
email
唯一索引
-
查询最近活跃用户 → 复合索引
-
清理过期 session → TTL 索引
案例 2:文章 & 评论(独立 collection)
comments 文档
索引设计
-
查询某篇文章的评论 →
article_id
索引
-
查询文章最新评论(分页) → 复合索引
-
查询某个用户的评论 →
user
索引
案例 3:电商订单表
order 文档
索引设计
-
查询用户订单 →
user_id + created_at
-
按状态统计订单 →
status
📖 5. 索引调优方法
-
db.collection.getIndexes()
→ 查看现有索引 -
db.collection.dropIndex("indexName")
→ 删除无用索引 -
db.collection.find(query).explain("executionStats")
→ 分析查询是否用到了索引
✅ 总结
-
建索引要根据查询场景(不要乱建)
-
复合索引要按查询顺序设计(最左前缀)
-
数组字段建索引会自动变成多键索引
-
大数据量表要考虑复合索引 + 分页优化
-
日志/临时数据用 TTL 索引