MongoDB 索引机制详解:单字段索引、复合索引、唯一索引与性能优化

🏷️ 标签:MongoDB 索引 数据库优化 MongoDB教程 后端开发 📝 适用人群:MongoDB 使用者、后端开发、数据库优化人员、学生 💡 核心亮点:系统讲解 MongoDB 索引类型、使用场景、执行计划分析与最佳实践


前言

建立索引可以提高查询效率,默认情况下,MongoDB 会为 _id 建立唯一索引,但该索引不能提升查询效率(仅用于主键唯一性约束)。MongoDB 支持对一个或多个字段建立索引,合理使用索引能让查询性能提升几十、上百倍。

本文带你系统学习 MongoDB 索引的核心知识点:索引类型、创建、查看、删除、执行计划分析、以及生产环境最佳实践,让你真正掌握 MongoDB 索引优化。


一、MongoDB 索引概述

索引是特殊的数据结构(B-tree),存储在内存中,能够帮助数据库快速定位、快速筛选、快速排序,而不必全表扫描。

没有索引的查询:COLLSCAN(全表扫描) 有索引的查询:IXSCAN(索引扫描)

在数据量超过万级、十万级、百万级时,索引差异会直接决定接口响应速度。


二、MongoDB 支持的索引类型

MongoDB 提供非常丰富的索引类型,满足不同业务场景:

1. 单字段索引(Single Field Index)

单字段索引是最常用、最简单的索引 ,针对单个字段创建索引。

例如:按用户名查询、按手机号查询、按订单号查询。

语法
复制代码
db.集合.createIndex({字段名: 1})
  • 1 表示升序
  • -1 表示降序(对单字段索引效率无影响)
示例

user 集合的 username 字段创建索引:

复制代码
db.user.createIndex({username: 1})
适用场景
  • 根据单个字段精确查询:{username: "张三"}
  • 根据单个字段范围查询:{age: {$gt: 20}}
  • 根据单个字段排序:sort({age: 1})
优点
  • 创建快
  • 体积小
  • 维护成本低
  • 最常用、最稳定

2. 复合索引(Compound Index)

复合索引是对 多个字段 联合建立索引。

复合索引遵循 "最左前缀原则"

语法
复制代码
db.集合.createIndex({字段1:1, 字段2:1, 字段3:1})
示例
复制代码
db.order.createIndex({user_id:1, create_time:-1})
适用场景
  • 多条件组合查询
  • 条件 + 排序 组合
最左前缀原则

索引 {a:1, b:1, c:1} 能支持以下查询:

  • a
  • a + b
  • a + b + c

不能支持

  • b
  • c
  • b + c

这是复合索引最核心规则。


3. 唯一索引(Unique Index)

唯一索引保证字段值不重复 ,类似 MySQL 的 UNIQUE

_id 就是默认唯一索引。

语法
复制代码
db.集合.createIndex({字段名:1}, {unique: true})
示例
复制代码
db.user.createIndex({phone:1}, {unique: true})
作用
  • 保证字段唯一
  • 避免重复数据插入
  • 提升查询速度

4. 多值索引(Multikey Index)

用于数组字段,MongoDB 会自动为数组每个元素创建索引。

例如:

复制代码
{
  name: "张三",
  tags: ["学生","篮球","阅读"]
}

创建索引:

复制代码
db.user.createIndex({tags:1})

可快速查询:

复制代码
db.user.find({tags: "篮球"})

5. 地理空间索引(2d / 2dsphere)

用于地理位置查询,如附近的人、附近店铺。

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

6. 文本索引(Text Index)

用于全文检索,支持关键词搜索。

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

三、MongoDB 索引常用命令

1. 查看集合所有索引

复制代码
db.集合.getIndexes()

2. 查看索引大小

复制代码
db.集合.totalIndexSize()

3. 删除索引

复制代码
// 删除单个索引
db.集合.dropIndex({字段名:1})

// 删除所有索引(除了 _id)
db.集合.dropIndexes()

4. 查看查询是否使用索引(执行计划)

复制代码
db.集合.find({name: "张三"}).explain("executionStats")

关键字段:

  • IXSCAN:使用索引 ✅
  • COLLSCAN:全表扫描 ❌(需要优化)

四、MongoDB 索引最佳实践(生产必看)

  1. 只为经常查询的字段建索引
  2. 不要创建过多索引(会降低写入性能)
  3. 复合索引优先,遵循最左前缀
  4. 范围查询字段放最后
  5. 排序字段必须放进索引里
  6. 避免使用 $nin$not$ne 等无法命中索引的操作
  7. 文本搜索优先使用 Elasticsearch,而非 MongoDB 文本索引
  8. 定期检查慢查询,优化缺失索引

五、索引优缺点总结

优点

  • 大幅提升查询速度
  • 加速排序
  • 降低 CPU 与内存消耗
  • 支持唯一约束

缺点

  • 占用磁盘空间
  • 降低写入 / 更新 / 删除速度
  • 过多索引会导致性能恶化

六、总结

MongoDB 索引是数据库性能提升的关键。

  • 默认 _id 索引仅用于主键,不能提升普通查询效率
  • 单字段索引适合简单查询
  • 复合索引适合多条件、条件 + 排序场景(最左前缀)
  • 唯一索引保证数据不重复
  • 生产环境必须通过 explain() 分析执行计划
  • 索引不是越多越好,合理设计才是最优

掌握 MongoDB 索引,你的数据库性能将提升一个档次。


版权声明

本文为原创 MongoDB 技术文章,CSDN 首发,系统讲解索引机制、类型、命令、最佳实践,禁止未经授权转载、抄袭、搬运,侵权必究!

相关推荐
newnazi4 小时前
RedHat10 安装MS SQL Server2025
linux·服务器·数据库
KaMeidebaby4 小时前
卡梅德生物技术快报|单 B 细胞抗体制备:流程优化、表达系统适配与性能数据
前端·数据库·其他·百度·新浪微博
2301_783848654 小时前
mysql数据库迁移到云平台流程_使用数据传输服务DTS工具
jvm·数据库·python
爱喝水的鱼丶4 小时前
SAP-ABAP:ABAP函数 NUMBER_GET_NEXT 详解:从编号范围对象获取下一个编号
运维·数据库·学习·sap·abap
颖火虫盟主4 小时前
Claude Code Hook 系统详解与 Hello World 实操
前端·网络·数据库
gQ85v10Db5 小时前
Redis 分布式锁进阶第三十四篇
数据库·redis·分布式
June`5 小时前
redis项目之命令解析器
数据库·c++·redis
老纪5 小时前
如何解决OUI图形界面无法调用_xhost与DISPLAY变量设置
jvm·数据库·python
TDengine (老段)5 小时前
TDengine 一条 SQL 从客户端到执行完成的全链路
大数据·数据库·sql·物联网·时序数据库·tdengine·涛思数据