如果没有索引,每次查询都像管理员从头翻到尾。
索引就是档案仓的目录卡、检索号、导航图。
没有索引
查询 -> 从第一个档案袋翻到最后一个
有索引
查询 -> 先查目录 -> 直接去目标区域MongoDB 默认只有 _id 索引。
其他索引,你要按查询需求主动设计。
最常见的几类:
- 单字段索引:一个字段
- 复合索引:多个字段组合
- 多键索引:数组字段
- 文本索引:文本搜索
- 哈希索引:哈希值索引,常见于特定分布策略场景
示例:
db.users.createIndex({ email: 1 })
db.orders.createIndex({ status: 1, createdAt: -1 })
db.orders.createIndex({ "items.sku": 1 })复合索引要特别注意字段顺序。
比如:
db.orders.createIndex({ status: 1, createdAt: -1 })它最擅长支持的是这类查询:
db.orders.find({ status: "paid" }).sort({ createdAt: -1 })因为目录本身就是按 status -> createdAt 排好的。
索引不是越多越好。因为:
- 每次写入都要维护索引
- 索引占用磁盘和内存
- 乱建索引会拖慢写入
建索引的原则不是“猜”,而是看你的真实访问路径。
一个很好用的习惯是:对关键查询做 explain()。
db.orders.find({ status: "paid" }).explain("executionStats")