MongoDB索引设计的7个最佳实践

Mei Lin | 2026-07-30T07:16:00 | DevOps, Database

MongoDB索引设计的实战经验,包括复合索引顺序、覆盖查询和ESR规则

# MongoDB索引设计的7个最佳实践 在MongoDB上踩了不少索引的坑,总结了7条最佳实践,希望能帮到大家。 ## 1. ESR规则(最重要!) 复合索引的字段顺序:**Equality -> Sort -> Range** ```javascript // 查询:status等于active,按创建时间排序,价格在100-500之间 db.products.find({ status: "active", // Equality price: { $gte: 100, $lte: 500 } // Range }).sort({ createdAt: -1 }) // Sort // 正确的索引顺序:E-S-R db.products.createIndex({ status: 1, // E:等值条件放前面 createdAt: -1, // S:排序字段放中间 price: 1 // R:范围条件放最后 }) ``` ## 2. 覆盖查询 ```javascript // 查询只需要name和price,不需要回表 db.products.find( { status: "active" }, { name: 1, price: 1, _id: 0 } // 投影 ) // 建一个包含所有返回字段的索引 db.products.createIndex({ status: 1, name: 1, price: 1 }) // explain输出:IXSCAN + PROJECTION_COVERED,完全走索引 ``` ## 3. 避免过多索引 ```javascript // 每个索引都占内存,写操作时都要更新 // 一个collection最多5-6个索引比较合理 // 用这个命令查看索引使用情况 db.products.aggregate([{ $indexStats: {} }]) // 长期没被使用的索引果断删掉 ``` ## 4. 部分索引 ```javascript // 只给活跃数据建索引,大幅减小索引体积 db.orders.createIndex( { userId: 1, createdAt: -1 }, { partialFilterExpression: { status: "active" } } ) ``` 记住ESR规则就能解决90%的索引问题。另外建议每个查询都`explain()`看一下执行计划。

← Back to Blog