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

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

1. 基础索引(Single Field Index)

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

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

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

    css 复制代码
      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(降序)创建复合索引

php 复制代码
    db.orders.createIndex({userId: 1, orderTime: -1})

3. 多键索引(Multikey Index)

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

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

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

css 复制代码
db.users.createIndex({hobbies: 1})

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

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

主要类型:

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

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

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

css 复制代码
db.shops.createIndex({location: "2dsphere"})

5. 文本索引(Text Index)

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

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

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

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

php 复制代码
db.articles.createIndex({title: "text", content: "text"})

6. 哈希索引(Hashed Index)

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

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

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

css 复制代码
db.users.createIndex({userId: "hashed"})

7. 唯一索引(Unique Index)

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

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

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

php 复制代码
db.users.createIndex({email: 1}, {unique: true})

8. 稀疏索引(Sparse Index)

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

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

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

php 复制代码
db.users.createIndex({nickname: 1}, {sparse: true})
相关推荐
爱勇宝6 分钟前
深扒 Anthropic 1680 位工程师简历:应届生几乎没机会,AI 公司最缺的不是博士
前端·后端·程序员
AskHarries22 分钟前
工具失败时怎么办:重试、回滚、人工确认和风险提示
后端·程序员
苏三说技术2 小时前
Claude Code从失控到起飞,只用了这些技巧
后端
长栎3 小时前
写 for 循环写了十年,你却从没用过迭代器模式最狠的那一面
后端
LiaCode3 小时前
Redis 在生产项目的使用
前端·后端
用户559822481223 小时前
Docker Compose Down 导致容器数据误删——ext4 日志恢复全记录
后端
LiaCode3 小时前
一天学完 redis 的爽翻版核心知识总结
前端·后端
大刚测试开发实战3 小时前
如何内网穿透访问本地私有化部署的TestHub
前端·后端·github
xiaodaoluanzha3 小时前
迄今為止,最簡單的編程語言 Nolang
前端·后端
Csvn3 小时前
Docker 容器管理入门 — 从镜像到容器编排
后端