MongoDB 有哪些索引?适用场景?

0 阅读3分钟

MongoDB 的索引核心作用是加速查询操作,其类型可根据查询场景分为基础索引、复合索引及特殊功能索引,以下是常用索引类型及说明:

1. 基础索引(Single Field Index)

最常用的索引类型,基于单个字段创建,默认按升序(1)或降序(-1)排列,能高效提升单字段的查询、排序性能。

  • 适用场景:针对单个字段的过滤查询(如 db.users.find({age: 25}))、排序操作(如 db.articles.sort({createTime: -1}))。

  • 示例:为 users 集合的 age 字段创建升序索引

      db.users.createIndex({age: 1})
    

2. 复合索引(Compound Index)

基于多个字段组合创建的索引,索引顺序遵循“前缀匹配原则”(查询需包含索引的前 N 个字段才能生效),适用于多字段组合查询或排序。

  • 适用场景:需同时过滤/排序多个字段的场景(如 db.orders.find({userId: 123}).sort({orderTime: -1}))。

  • 注意:索引字段顺序影响查询效率,过滤频繁的字段应放在前面(如 {userId: 1, orderTime: -1} 优于 {orderTime: -1, userId: 1})。

  • 示例:为 orders 集合的 userId(升序)和 orderTime(降序)创建复合索引

    db.orders.createIndex({userId: 1, orderTime: -1})

3. 多键索引(Multikey Index)

自动为数组类型字段创建的索引(无需手动指定类型),会为数组中的每个元素单独建立索引项,支持对数组元素的精准查询。

  • 适用场景:查询数组中包含特定元素的文档(如 db.users.find({hobbies: "reading"}))。

  • 示例:users 集合的 hobbies 是数组字段(如 ["reading", "sports"]),创建索引后自动成为多键索引

db.users.createIndex({hobbies: 1})

4. 地理空间索引(Geospatial Index)

专门用于地理位置数据(如经纬度)的索引,支持“附近位置查询”“区域包含查询”等地理相关操作。

主要类型:

 2dsphere:适用于球面地理坐标(如 GPS 经纬度,格式 [longitude, latitude]),支持球形距离计算。

 2d:适用于平面坐标系(如游戏地图的二维坐标),较少使用。
  • 适用场景:外卖平台“附近的商家”、社交软件“附近的人”等场景。

  • 示例:为 shops 集合的 location 字段(经纬度数组)创建球面索引

db.shops.createIndex({location: "2dsphere"})

5. 文本索引(Text Index)

用于文本内容的全文检索,可对单个或多个字符串字段创建,支持关键词匹配、模糊查询(不支持通配符,但支持自然语言语义)。

  • 适用场景:博客内容搜索、商品标题/描述的关键词查询(如 db.articles.find({$text: {$search: "MongoDB 索引"}}))。

  • 注意:一个集合最多只能创建一个文本索引,且不支持中文分词(需结合第三方插件如 Elasticsearch 实现更优的中文检索)。

  • 示例:为 articles 集合的 title 和 content 字段创建文本索引

db.articles.createIndex({title: "text", content: "text"})

6. 哈希索引(Hashed Index)

基于字段的哈希值创建索引,索引值是字段值的哈希结果,仅支持“精准匹配查询”(不支持范围查询、排序)。

  • 适用场景:配合 MongoDB 分片功能,按哈希值均匀分配数据到不同分片(实现数据负载均衡)。

  • 示例:为 users 集合的 userId 字段创建哈希索引,用于分片键

db.users.createIndex({userId: "hashed"})

7. 唯一索引(Unique Index)

在普通索引基础上添加“唯一性约束”,确保索引字段的值(或复合索引的字段组合)不重复,类似关系型数据库的 UNIQUE 约束。

  • 适用场景:保证数据唯一性(如用户手机号、邮箱不能重复)。

  • 示例:为 users 集合的 email 字段创建唯一索引

db.users.createIndex({email: 1}, {unique: true})

8. 稀疏索引(Sparse Index)

仅为包含索引字段的文档创建索引项,不包含该字段的文档会被排除在索引之外,可减少索引体积。

  • 适用场景:索引字段为非必填字段(如用户的“昵称”,部分用户未设置),仅需查询有该字段的文档时使用。

  • 示例:为 users 集合的 nickname 字段创建稀疏索引

db.users.createIndex({nickname: 1}, {sparse: true})