MongoDB 的索引是提高查询性能的核心机制,类似于传统关系型数据库的索引。以下是对 MongoDB 索引的详细说明:

news/2025/3/29 6:05:33/

MongoDB 的索引是提高查询性能的核心机制,类似于传统关系型数据库的索引。以下是对 MongoDB 索引的详细说明:

一、索引基础
1. 索引的作用
加速查询:通过索引快速定位数据,避免全集合扫描(COLLSCAN)。

排序优化:索引可以加速排序操作(如 sort())。

唯一性约束:通过唯一索引(unique: true)确保字段值不重复。

稀疏性控制:稀疏索引(sparse: true)仅对存在该字段的文档创建索引。

2. 默认索引
MongoDB 自动为 _id 字段创建唯一索引,不可删除。

二、索引类型
1. 单字段索引(Single Field Index)
对单个字段创建索引:

javascript
复制
db.collection.createIndex({ field: 1 })  // 1 表示升序,-1 表示降序
适用于精确匹配或范围查询的字段。

2. 复合索引(Compound Index)
对多个字段联合创建索引:

javascript
复制
db.collection.createIndex({ field1: 1, field2: -1 })
字段顺序重要:查询条件中字段的顺序需与索引一致或前缀匹配。

排序优化:索引字段的顺序会影响 sort() 的性能。

3. 多键索引(Multikey Index)
自动为数组字段中的每个元素创建索引:

javascript
复制
db.collection.createIndex({ arrayField: 1 })
适用于查询数组中的元素(如 arrayField: value)。

4. 文本索引(Text Index)
支持全文搜索:

javascript
复制
db.collection.createIndex({ content: "text" })
支持多字段联合文本索引:

javascript
复制
db.collection.createIndex({ title: "text", description: "text" })
5. 地理空间索引(Geospatial Index)
2dsphere:支持球面几何查询(如经纬度):

javascript
复制
db.places.createIndex({ location: "2dsphere" })
2d:支持平面几何查询(适用于旧版本)。

6. 哈希索引(Hashed Index)
对字段值计算哈希后创建索引,常用于分片键:

javascript
复制
db.collection.createIndex({ field: "hashed" })
7. TTL 索引(Time-To-Live Index)
自动删除过期文档(如日志数据):

javascript
复制
db.logs.createIndex({ createdAt: 1 }, { expireAfterSeconds: 3600 })
8. 唯一索引(Unique Index)
确保字段值唯一:

javascript
复制
db.users.createIndex({ email: 1 }, { unique: true })
9. 稀疏索引(Sparse Index)
仅索引包含该字段的文档:

javascript
复制
db.users.createIndex({ phone: 1 }, { sparse: true })
三、索引管理
1. 查看索引
javascript
复制
db.collection.getIndexes()  // 查看集合的所有索引
2. 删除索引
javascript
复制
db.collection.dropIndex("indexName")  // 删除指定索引
db.collection.dropIndexes()           // 删除所有索引(保留 _id 索引)
3. 重建索引
javascript
复制
db.collection.reIndex()  // 重建所有索引(慎用,可能阻塞操作)
四、索引使用策略
1. 索引选择
MongoDB 查询优化器会自动选择最优索引。

可通过 explain() 分析查询执行计划:

javascript
复制
db.collection.find({ field: "value" }).explain("executionStats")
2. 覆盖查询(Covered Query)
如果查询结果完全由索引字段提供,无需回表查文档:

javascript
复制
// 创建复合索引
db.users.createIndex({ name: 1, age: 1 })
// 覆盖查询示例
db.users.find({ name: "Alice" }, { _id: 0, name: 1, age: 1 })
3. 索引交集(Index Intersection)
MongoDB 可以将多个索引的结果合并,但通常复合索引更高效。

五、索引的限制与注意事项
内存占用:

索引存储在内存中,大集合的索引可能占用较多内存。

写操作开销:

索引会降低插入、更新、删除操作的性能。

索引键大小限制:

索引键(Index Key)的总大小不能超过 1024 字节。

查询模式匹配:

某些查询可能无法使用索引(如正则表达式未左锚定)。

六、最佳实践
优先使用复合索引:避免创建过多单字段索引。

避免全集合扫描:对高频查询字段建立索引。

索引选择性:高基数(唯一值多)的字段更适合建索引。

监控索引使用:

javascript
复制
db.collection.aggregate([{ $indexStats: {} }])
删除冗余索引:定期清理未使用的索引。

示例场景
场景 1:查询优化
javascript
复制
// 创建复合索引
db.orders.createIndex({ customerId: 1, orderDate: -1 })

// 查询最近订单
db.orders.find({ customerId: 123 }).sort({ orderDate: -1 })
场景 2:唯一约束
javascript
复制
// 确保用户名唯一
db.users.createIndex({ username: 1 }, { unique: true })
通过合理设计索引,可以显著提升 MongoDB 的查询性能,但需根据实际场景权衡读写开销。


http://www.ppmy.cn/news/1583170.html

相关文章

一文详解redis

redis 5种数据类型 string 字符串是 Redis 里最基础的数据类型,一个键对应一个值。 设置值 SET key value例如: SET name "John"获取值 GET key例如: GET namelist 列表是简单的字符串列表,按插入顺序排序。 在列…

[从零开始学习JAVA] IO流下的高级流

前言: 在前面我们从IO流体系出发,分别介绍了字节流和字符流,并且详细讲解了其下沿的各种基本流,而在今天我们就要学习一下IO流中的几个高级流。 1.缓冲流 缓冲流其实就是可以让我们自己手动提供缓冲区,以此来增加读写速…

NLP高频面试题(十一)——RLHF的流程有哪些

随着大语言模型(如GPT系列)的快速发展,RLHF(Reinforcement Learning from Human Feedback,即基于人类反馈的强化学习)逐渐成为训练高质量模型的重要方法。本文将简单清晰地介绍RLHF的整体流程。 一、RLHF …

Python第六章12:序列切片练习题

# 序列切片的课后题 # 有字符串:“蛋八狗,的十八臭个这,娃芦葫爱最曼特奥” # 请使用学过的任何方式,得到“臭八十的” # 参考方法: # 1.倒序字符串,切片取出或切片取出,然后倒序 # 2.s…

1.(vue3.x+vite)创建工程

前端技术社区总目录(订阅之前请先查看该博客) 效果预览 1:使用vite生成项目模板 npm init vite-app myvue1 执行效果图: 2:package.json 调整依赖为最新版本 如下所示: 3:根目录下创建vi…

【Linux-驱动开发-系统调用流程】

Linux-驱动开发-系统调用流程 ■ Linux-系统调用流程■ Linux-file_operations 结构体 ■ Linux-系统调用流程 ■ Linux-file_operations 结构体 在 Linux 内核文件 include/linux/fs.h 中有个叫做 file_operations 的结构体,此结构体就是 Linux 内核驱动操作函数集…

模拟算法专题

模拟算法介绍 模拟就是依葫芦画瓢,题目中要求的操作是什么样的,用代码去实现这个操作即可。 1.替换所有的问号 题目链接:1576. 替换所有的问号 - 力扣(LeetCode) 题目描述:将字符串中的所有问号转换为其…

春日焕新居:约克VRF中央空调,科技赋能,带你开启健康呼吸新时代

春回大地,万物复苏的季节里,无数家庭怀揣美好憧憬之心开启家居焕新装修。然而,当精心挑选的建材逐渐构筑起理想家的雏形,往往伴随着甲醛等有害气体的困扰,如同一道无形的屏障,阻挡我们对健康家居生活的追求。别担心,约克VRF中央空调凭借其卓越的产品性能和服务,为您打造一个健康…