You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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

火山引擎 最新活动