🏷️ 标签: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} 能支持以下查询:
aa + ba + b + c
不能支持:
bcb + 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 索引最佳实践(生产必看)
- 只为经常查询的字段建索引
- 不要创建过多索引(会降低写入性能)
- 复合索引优先,遵循最左前缀
- 范围查询字段放最后
- 排序字段必须放进索引里
- 避免使用
$nin、$not、$ne等无法命中索引的操作 - 文本搜索优先使用 Elasticsearch,而非 MongoDB 文本索引
- 定期检查慢查询,优化缺失索引
五、索引优缺点总结
优点
- 大幅提升查询速度
- 加速排序
- 降低 CPU 与内存消耗
- 支持唯一约束
缺点
- 占用磁盘空间
- 降低写入 / 更新 / 删除速度
- 过多索引会导致性能恶化
六、总结
MongoDB 索引是数据库性能提升的关键。
- 默认
_id索引仅用于主键,不能提升普通查询效率 - 单字段索引适合简单查询
- 复合索引适合多条件、条件 + 排序场景(最左前缀)
- 唯一索引保证数据不重复
- 生产环境必须通过
explain()分析执行计划 - 索引不是越多越好,合理设计才是最优
掌握 MongoDB 索引,你的数据库性能将提升一个档次。
版权声明
本文为原创 MongoDB 技术文章,CSDN 首发,系统讲解索引机制、类型、命令、最佳实践,禁止未经授权转载、抄袭、搬运,侵权必究!