如何在MongoDB中创建索引以提升数据库性能?
没问题!这就给你详细拆解MongoDB里创建索引的操作方法,从基础到进阶都覆盖到,帮你针对性做性能优化~
这是最常用的索引类型,针对单个字段加速查询或排序。比如你有个users集合,经常按email查询用户,就可以这么建:
db.users.createIndex({ email: 1 })
这里的1代表升序排列,用-1就是降序,效果差不多,主要看你的排序需求。
如果你的查询经常同时用到多个字段,比如经常按age筛选再按name排序,就需要建复合索引:
db.users.createIndex({ age: 1, name: -1 })
⚠️ 划重点:复合索引的字段顺序很关键!MongoDB会优先匹配左边的字段,所以一定要把查询频率最高、筛选性最强的字段放在前面。
1. 多键索引(针对数组字段)
如果集合里有数组类型的字段,比如users里的hobbies数组,要查询喜欢“读书”的用户,就建多键索引:
db.users.createIndex({ hobbies: 1 })
MongoDB会自动为数组里的每个元素建立索引,完美适配数组包含查询。
2. 全文本索引(针对字符串内容搜索)
如果需要对长文本内容做关键词搜索,比如articles集合的content字段,建文本索引:
db.articles.createIndex({ content: "text" })
之后就可以用全文搜索查询:
db.articles.find({ $text: { $search: "MongoDB 性能优化" } })
3. 地理空间索引(针对位置数据)
如果存了地点坐标,比如places集合的location字段(格式是{ type: "Point", coordinates: [lng, lat] }),建2dsphere索引支持地理查询:
db.places.createIndex({ location: "2dsphere" })
之后就能查附近的地点,比如找10公里内的餐厅。
1. 唯一索引
确保字段值全局唯一,比如用户邮箱不能重复:
db.users.createIndex({ email: 1 }, { unique: true })
插入重复值时会直接报错,避免数据重复。
2. 稀疏索引
只给存在目标字段的文档建索引,比如有些用户没填phone字段,不想为这些空文档浪费索引空间:
db.users.createIndex({ phone: 1 }, { sparse: true })
3. 过期索引(TTL索引)
自动删除过期文档,比如日志集合只保留24小时的日志:
db.logs.createIndex({ createdAt: 1 }, { expireAfterSeconds: 86400 })
这里createdAt是存储文档创建时间的字段,86400秒就是24小时。
- 查看集合的所有索引:
db.users.getIndexes()
- 删除某个索引(可以用索引名或者索引定义):
// 用索引名(比如单字段索引的默认名是`email_1`) db.users.dropIndex("email_1") // 或者用索引定义 db.users.dropIndex({ email: 1 })
- 索引会增加写入(插入/更新/删除)的开销,所以不要贪多,只给常用查询字段建索引;
- 用
explain("executionStats")可以查看查询是否用到了索引,比如:
db.users.find({ email: "test@example.com" }).explain("executionStats")
看输出里的executionStats.totalDocsExamined,如果等于1说明用到了索引,远大于1就是全表扫描了;
- 对于大数据量集合,建索引可能会耗时,可以加
background: true让索引在后台创建,不影响业务:
db.users.createIndex({ email: 1 }, { background: true })
内容的提问来源于stack exchange,提问作者Chandrashekhar Patidar




