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

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.mzph.cn/pingmian/73471.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解指针(1)(C语言版)

文章目录 前言一、内存和地址1.1 内存1.2 究竟该如何理解编址 二、指针变量和地址2.1 取地址操作符&2.2 指针变量和解引用操作符*2.2.1 指针变量2.2.2 如何拆解指针类型2.2.3 解引用操作符 2.3 指针变量的大小 三、指针变量类型的意义3.1 指针的解引用3.2 指针-整数3.3 voi…

【视频】m3u8相关操作

【视频】郭老二博文之:图像视频汇总 1、视频文件转m3u8 1.1 常用命令 1)默认只保留 5 个ts文件 ffmpeg -i input.mp4 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls stream1.m3u82)去掉音频 -an,保留全部ts文件 ffmpeg -i input.mp4 -vf scale=640:480 -an -…

AWS CloudWatch 实战:构建智能监控与自动化运维体系

摘要:本文通过实际案例,详细讲解如何利用AWS CloudWatch实现云端资源的实时监控、日志分析与自动化运维,助力企业提升系统稳定性与运维效率 一、场景痛点分析 某电商平台迁移至AWS后面临三大挑战: 故障响应滞后:服务器…

第一天学爬虫

阅读提示:我今天才开始尝试爬虫,写的不好请见谅。 一、准备工具 requests库:发送HTTP请求并获取网页内容。BeautifulSoup库:解析HTML页面并提取数据。pandas库:保存抓取到的数据到CSV文件中。 二、爬取步骤 发送请求…

网络编程和计算机网络五层模型的关系

计算机网络的五层模型(应用层、传输层、网络层、链路层和物理层)为网络编程提供了基础框架和通信机制。网络编程就是在这些层次上实现应用程序之间的通信。 计算机网络五层模型 (1)应用层: 作用:应用层是…

知识篇 | Oracle的 TEMP表空间管理和优化

Oracle临时表空间(TEMP)是数据库中用于存储会话级临时数据的核心组件,主要用于支持需要中间结果集的操作(如排序、哈希连接)。其数据在事务结束或会话终止后自动释放,不持久化存储。 核心特点:…

重学Java基础篇—线程池参数优化指南

一、核心参数解析 线程池(ThreadPoolExecutor)的性能取决于以下关键参数: 参数说明corePoolSize核心线程数,即使空闲也不会被回收maximumPoolSize最大线程数,当队列满且核心线程忙时创建新线程workQueue任务队列&…

记一次线上环境JAR冲突导致程序报错org.springframework.web.util.NestedServletException

一、问题描述 有个文件导入功能,用到了Hutool 的加密解密功能,本地运行完全可以,但是线上报错:“org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFou…

怎么快速部署Sock5代理到ubuntu云服务器

使用 Dante (推荐) 1. 安装 Dante bash Copy sudo apt update sudo apt install dante-server -y 2. 配置 Dante 编辑配置文件 /etc/danted.conf: bash Copy sudo nano /etc/danted.conf 替换为以下内容(按需修改端口和认证)&#…

华为OD机试2025A卷 - 游戏分组/王者荣耀(Java Python JS C++ C )

最新华为OD机试 真题目录:点击查看目录 华为OD面试真题精选:点击立即查看 题目描述 2020年题: 英雄联盟是一款十分火热的对战类游戏。每一场对战有10位玩家参与,分为两组,每组5人。每位玩家都有一个战斗力,代表着这位玩家的厉害程度。为了对战尽可能精彩,我们需要…

OpenRAND可重复的随机数生成库

OpenRAND 是一个 C++ 库,旨在通过提供强大且可复制的随机数生成解决方案来促进可重复的科学研究。它是一个简单的仅头文件库,性能可移植,统计稳健,并且易于集成到任何 HPC 计算项目中。 特征 跨平台支持:OpenRAND 旨在跨各种平台无缝工作,包括 CPU 和 GPU。其仅标题库设计…

接口/UI自动化面试题

一、UI自动化 1.1、接口和UI自动化有多少用例? 回答策略:根据接口设定用例,100个接口,自动化case在1500-2000左右。结合自身的项目,回答覆盖的主功能流程。 示例: 接口自动化的测试case一般需要根据接口数…

使用Docker部署RabbitMQ

第一步:安装 RabbitMQ # 1. 拉取镜像 docker pull rabbitmq:3.12.0-management# 2. 启动容器(开放端口 数据持久化) docker run -d \--nameshare_rabbitmq \-p 5672:5672 \ # AMQP 协议端口-p 15672:15672 \ # 管理界面端口…

2.基于多线程的TCP服务器实现

目录 1. 简单分析之前的代码 2. 多线程服务器设计 2.1 C11线程的基本使用 2.2 服务器主体逻辑 3. 错误处理的封装 4. 完整的代码实现 客户端代码(client.cpp) 服务器代码(server.cpp) 5. 运行方式 在我们预想中&#xff…

Python Web 框架 Django、Flask 和 FastAPI 对比

在探索 Python Web 框架时,Django、Flask 和 FastAPI 无疑是最常被提及的名字。根据我们最新的 Python 开发者调查,这三大框架继续稳坐后端 Web 开发的热门宝座。它们均为开源项目,并且与 Python 的最新版本无缝兼容。然而,面对不…

SQL Server数据库表删除分区

在 SQL Server 中删除分区并将表恢复到非分区状态,需按以下步骤操作: 一、合并所有分区 1. 检查现有分区结构 首先确认表的分区方案和分区函数: -- 查看分区方案 SELECT * FROM sys.partition_schemes;-- 查看分区函数 SELECT * FROM sys…

信息安全和病毒防护——安全协议关于SSL和TLS协议的补充说明

文章目录 SSL与TLS的关系SSL与TLS的核心区别SSL/TLS的典型应用安全建议总结SSL与TLS的关系 SSL(Secure Sockets Layer,安全套接层)和TLS(Transport Layer Security,传输层安全)是同一技术体系的演进版本,而非完全独立的协议。其发展历程如下: SSL 1.0(1994):未公开…

[原创](Modern C++)现代C++的关键性概念: 多维数组的下标引用.

[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、C …

从零构建大语言模型全栈开发指南:第二部分:模型架构设计与实现-2.2.3实战案例:在笔记本电脑上运行轻量级LLM

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 实战案例:在笔记本电脑上运行轻量级LLM2.2.3 模型架构设计与实现1. 环境与工具准备1.1 硬件要求1.2 软件栈选择2. 轻量级模型架构设计2.1 模型参数配置2.2 关键技术优化3. 实战流程3.1 数据准备流程3.2…

工业软件的破局与重构:从技术依赖到自主创新的未来路径

工业软件作为现代工业的“神经与大脑”,不仅是制造业数字化转型的核心工具,更是国家工业竞争力的战略制高点。近年来,中国工业软件市场在政策驱动与技术迭代中迅猛发展,但核心技术受制于人的困境仍待突破。如何实现从“跟跑”到“…