MongoDB索引
一、索引核心价值
MongoDB索引通过构建高效查询路径,从根本上改变数据检索方式。当未建立索引时,数据库引擎被迫执行全集合扫描(COLLSCAN),如同在无序的书架上逐本查找目标书籍。通过建立索引,查询复杂度从O(n)降为O(log n),在百万级文档的集合中,查询速度可提升数百倍。
示例场景:用户表包含username
字段,未建索引时find({username: "alice"})
需要扫描全部文档。建立索引后,查询直接定位到目标文档。find({username: "alice"})
需要扫描全部文档。 建立索引后,查询
二、索引架构原理
MongoDB采用B-Tree数据结构(非MySQL的B+Tree),每个节点存储键值对和子节点指针。B-Tree的特性保证:MongoDB采用B-Tree数据结构(非MySQL的B+Tree),每个节点存储键值对和子节点指针。 B-Tree的特性保证:
-
平衡树结构:所有叶子节点位于相同深度
-
高效范围查询:顺序存储的键值支持快速区间遍历
-
动态平衡:插入/删除时自动调整结构
-
三、索引类型详解
1. 单字段索引
// 创建年龄字段降序索引
db.users.createIndex({ age: -1 })
-
适用场景:单个条件查询或排序
-
排序方向影响:仅对覆盖查询的排序结果有效
2. 复合索引(字段顺序敏感)
db.orders.createIndex({ customer_id: 1, order_date: -1 })
-
最左前缀原则:查询必须包含左侧字段才能触发索引
-
排序优化:
{a:1, b:-1}
索引可支持{a:1, b:-1}
索引可支持'a ASCa ASC, b DESC
的排序需求
3. 特殊索引类型
索引类型 | 命令示例 | 应用场景 |
---|---|---|
多键索引 | 自动为数组字段创建 | 商品标签数组["book","tech"] |
地理空间索引 | 'db.places.createIndex({ locdb.places.createIndex({ loc: "2dsphere" }) | 附近地点搜索 |
文本索引 | 'db.articles.createIndex({ content:db.articles.createIndex({ content: "text" }) | 全文检索 |
哈希索引 | 'db.logs.createIndex({ _id:db.logs.createIndex({ _id: "hashed" }) | 分片键均匀分布 |
4. 高级索引属性
TTL索引(自动清理)
// 日志保留24小时
db.logs.createIndex({ create_time: 1 }, { expireAfterSeconds: 86400 })
部分索引(存储优化)
// 只索引VIP用户
db.users.createIndex({ vip: 1 },{ partialFilterExpression: { vip: true } }
)
稀疏索引(空间优化)
// 忽略无phone字段的文档
db.contacts.createIndex({ phone: 1 }, { sparse: true })
四、索引管理实战
1. 索引全生命周期管理
// 查看索引详情
db.products.getIndexes()// 创建带自定义名称的索引
db.orders.createIndex({ status: 1, amount: -1 }, { name: "status_amount_idx" }
)// 删除指定索引
db.sales.dropIndex("region_sales_idx")
2. 性能分析技巧
// 分析查询执行计划
db.orders.find({customer_id: "C123",order_date: { $gt: ISODate("2023-01-01") }
}).explain("executionStats")
关键指标解读:
-
totalKeysExamined
:扫描索引键数量 -
totalDocsExamined
:检查文档数量 -
executionTimeMillis
:实际执行时间
五、高效索引策略
1. 覆盖查询优化
// 创建复合索引
db.employees.createIndex({ dept: 1, salary: 1 })// 覆盖查询示例
db.employees.find({ dept: "Engineering" },{ _id: 0, dept: 1, salary: 1 }
)
实现条件:
-
查询所有字段必须包含在索引中
-
结果排除
_id
字段(除非索引包含_id
)
2. 索引设计原则
-
ESR原则:相等匹配(Equality)字段在前,排序(Sort)字段居中,范围查询(Range)字段在后
-
写读比例:索引使写操作成本增加约5%,需平衡读写频率
-
内存优化:确保常用索引可完全载入内存
3. 常见陷阱规避
-
过度索引:每个额外索引增加写入开销
-
索引键顺序错误:
{a:1, b:1}
与{b:1, a:1}
性能差异显著 -
低效运算符:
$exists
、$ne
等可能导致索引失效
六、性能调优案例
场景:电商订单查询缓慢
// 原始查询
db.orders.find({user_id: "U1001",status: "shipped",order_date: { $gte: ISODate("2023-06-01") }
}).sort({ amount: -1 })
优化步骤:
-
分析现有索引:发现使用全表扫描
-
创建复合索引:
db.orders.createIndex({ user_id: 1, status: 1, order_date: 1, amount: -1 })
-
验证执行计划:确认使用IXSCAN并覆盖排序
优化后结果:查询时间从1200ms降至15ms
结语
合理使用索引可使MongoDB查询性能提升10-100倍,但需要持续监控和优化。建议:
-
使用
$indexStats
分析索引使用情况 -
定期执行
explain()
分析慢查询explain()
分析慢查询 -
结合Compass可视化工具进行索引管理
通过深入理解索引机制,结合业务场景设计最优索引策略,可充分发挥MongoDB的高性能优势,构建高效稳定的数据库系统。
相关文章:
MongoDB索引
一、索引核心价值 MongoDB索引通过构建高效查询路径,从根本上改变数据检索方式。当未建立索引时,数据库引擎被迫执行全集合扫描(COLLSCAN),如同在无序的书架上逐本查找目标书籍。通过建立索引,查询复杂度从…...
Docker--Docker网络原理
虚拟网卡 虚拟网卡(Virtual Network Interface,简称vNIC) 是一种在软件层面模拟的网卡设备,不依赖于物理硬件,而是通过操作系统或虚拟化技术实现网络通信功能。它允许计算机在虚拟环境中模拟物理网卡的行为࿰…...
Java 性能优化:如何在资源受限的环境下实现高效运行?
Java 性能优化:如何在资源受限的环境下实现高效运行? 在计算机系统中,性能优化是一项至关重要的任务,尤其是在资源受限的环境下,如何让 Java 程序高效运行是许多开发者面临的挑战。本文将深入探讨 Java 性能优化的策略…...
Spring之我见 - Spring MVC重要组件和基本流程
核心组件详解 前端控制器 - DispatcherServlet 作用:所有请求的入口,负责请求分发和协调组件。 public class DispatcherServlet extends HttpServlet {// 核心服务方法protected void doService(HttpServletRequest request, HttpServletResponse re…...
MongoDB常用命令
数据库操作 显示所有数据库 show dbs 切换/创建数据库 (如果数据库不存在则创建) use <database_name> 删除当前数据库 db.dropDatabase() 查看当前数据库 db 查看数据库状态 db.stats() 集合操作 显示当前数据库中的所有集合 show collections 创建集合 d…...
Java Set/List 知识点 Java面试 基础面试题
Java Set/List 知识点 Set与List区别 List 有序、值可重复,内部数据结构 Obejct[ ] 数组Set 无序、值不重复,内部数据结构 HashMap keyobject value固定new Object() ArrayList 有序存储元素允许元素重复,允许存储 null 值支持动态扩容非线程安全 HashSet、LinkedHa…...
C#委托介绍
委托可以将方法作为参数传递,同时委托也可以自己作为参数传递 委托可分为自定义委托delegate 无返回值的Action 与有返回值的Func委托 也有匿名委托与Lamada 委托支持多播是事件的基础 用处如在分线程调用主线程的UI invoke public delegate string Say(stri…...
三网通电玩城平台系统结构与源码工程详解(三):控制台与银商权限模块设计
本篇聚焦于三网通电玩城系统中的控制台管理系统及银商权限逻辑。通过深入解构后台系统的角色分权、账目明细管理、发卡接口与日志追踪机制,本文将提供完整的权限划分方案和部分关键实现代码,为平台运维与数据安全提供坚实基础。 一、控制台整体结构概览 …...
audio 核心服务AudioPolicyService 和AudioFlinger启动流程
目录 1、audioserver启动 2、AudioPolicyService启动 3、AudioFlinger启动 audio的核心服务有两个,AudioPolicyService 和AudioFlinger他们到在audioserver一个进程中 1、audioserver启动 设备开机,系统启动时将执行 /system/etc/init/audioserver.rc…...
Android自动化功能-使用Appium获取android页面节点元素信息
一、appium安装和使用 官方网站:https://appium.io/docs/en/latest/ github地址:https://github.com/appium/appium 安装步骤: 首先需要安装node.js 安装好node.js之后使用npm安装 appium npm install -g appium appium -v # 检查安装版本…...
springboot项目配置springMVC
为什么需要配置springMVC 在Spring Boot中配置Spring MVC,实际上是为了更好地集成和使用Spring框架提供的Web开发功能。 Spring Boot本身是为了简化Spring应用的配置和部署,它内置了一些默认的配置和组件,帮助开发者快速启动应用,…...
解决 MongoDB 查询中的 `InvalidMongoDbApiUsageException` 错误
您在使用 Spring Data MongoDB 时遇到了 InvalidMongoDbApiUsageException 异常,错误信息如下: “由于 com.mongodb.BasicDocument 的限制,您无法添加第二个 ‘null’ 条件。查询已经包含 ‘{ “KaTeX parse error: Expected }, got EOF at e…...
多模态知识图谱:重构大模型RAG效能新边界
当前企业级RAG(Retrieval-Augmented Generation)系统在非结构化数据处理中面临四大核心问题: 数据孤岛效应:异构数据源(文档/表格/图像/视频)独立存储,缺乏跨模态语义关联,导致知识检…...
基于大模型的贲门失弛缓症手术全流程风险预测与治疗方案研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 1.3 研究方法与技术路线 二、贲门失弛缓症概述 2.1 定义与发病机制 2.2 临床表现与诊断标准 2.3 治疗现状与挑战 三、大模型预测原理与数据基础 3.1 大模型介绍与选择依据 3.2 数据收集与预处理 3.3 模型训…...
C语言内存函数
1.memcpy函数 1.1:memcpy函数的介绍 1.2:模拟实现memcpy函数 我实现的memcpy函数无法处理两块重叠的内存的数据的拷贝 #include<assert.h> void* my_memcpy(void* dest, const void* src,size_t num) {assert(dest ! NULL && src ! NULL);//从src指向的内存位…...
Uniapp:navigator(页面跳转)
目录 一、基本概述二、属性说明三、具体使用 一、基本概述 页面跳转。该组件类似HTML中的<a>组件,但只能跳转本地页面。目标页面必须在pages.json中注册。 二、属性说明 属性名类型默认值说明平台差异说明urlString应用内的跳转链接,值为相对路…...
建造者模式详解及其在自动驾驶场景的应用举例(以C++代码实现)
模式定义 建造者模式(Builder Pattern)是一种创建型设计模式,用于分步构造复杂对象。该模式将对象构建过程与其表示分离,支持通过相同构建过程生成不同表现形式,特别适合需要灵活配置的自动驾驶车辆系统搭建场景。 自…...
2025年数字媒体设计与文化交流国际会议 (DMACE 2025)
2025 International Conference on Digital Media Art and Cultural Exchange 【一】、大会信息 会议简称:DMACE 2025 大会地点:中国烟台 收录检索:提交Ei Compendex,CPCI,CNKI,Google Scholar等 【二】会议…...
【MCP Node.js SDK 全栈进阶指南】利用TypeScript-SDK打造高效MCP应用
前言 在MCP(模型上下文协议)的世界中,SDK(软件开发工具包)是开发者构建应用的重要工具。作为MCP生态中最活跃的SDK之一,TypeScript-SDK提供了简洁而强大的接口,帮助开发者快速构建高效的MCP应用。本文将带你深入了解MCP的TypeScript-SDK,掌握其核心概念和使用方法,让…...
LangChain4j 搭配 Kotlin:以协程、流式交互赋能语言模型开发
Kotlin 支持 | LangChain4j Kotlin 是一种面向 JVM(及其他平台)的静态类型语言,能够实现简洁优雅的代码,并与 Java 库无缝互操作。 LangChain4j 利用 Kotlin 扩展和类型安全构建器来增强 Java API,为其增添特定于 Ko…...
搜索引擎的高级语法
文章目录 精确搜索:双引号站内搜索:site通配符搜索:*减号缩小范围:-文档搜索:filetypeURL搜索: inurl标题搜索:intitle正文搜索:intext参考链接 精确搜索:双引号 “ ” …...
探秘 SenseGlove Nova 2力反馈手套,解锁 VR 键盘交互新方式
在虚拟现实(VR)技术不断发展的现今,键盘交互体验的优化成为众多科研人员关注的重点。今天,让我们一同走进 Heilbronn 大学与 SenseGlove 的合作项目,探寻 SenseGlove Nova 2 力反馈手套为 VR 环境中的键盘交互带来的新…...
品牌如何通过朝日新闻出海日本?——某企业日本媒体发稿实战
文 | 言同数字亚太传播实验室 一、日本市场的隐形门槛:中国品牌的三大痛点 案例背景: 某中国灵芝保健品企业(代号"ForestLife"),产品虽获中国/欧盟有机认证,但在日本市场面临: 认知…...
安全文件共享实际上是什么样的呢?
通过即时通讯应用共享敏感信息的安全漏洞由来已久,且令人担忧。很少有事件像最近曝光的美国高级政客通过热门即时通讯应用 Signal 泄露军事攻击计划那样引起公众关注。 此类备受瞩目的漏洞凸显了全球各组织迫切需要重新评估其安全交换机密数据的方法。对于许多机密…...
深入探索Spark-Streaming:从基础到核心编程
在大数据实时处理领域,Spark-Streaming凭借其强大功能脱颖而出。它是Spark生态系统中处理流式数据的利器,支持Kafka、Flume等多种数据输入源,能利用Spark的map、reduce等原语处理数据,处理结果可存储于HDFS、数据库等。 Spark-Str…...
深度学习3.6 softmax回归的从零开始实现
本章节引入3.5的数据集 import torch from IPython import display from d2l import torch as d2lbatch_size 256 #迭代器批量 train_iter, test_iter d2l.load_data_fashion_mnist(batch_size)3.6.1 初始化模型参数 num_inputs 784 # 权重矩阵长度 num_outputs 10 # 类别…...
使用Spark-TTS-0.5B模型,文本合成语音
文章目录 背景模型介绍拉取开源代码conda下载与使用项目环境配置修改部分代码文件进阶玩法小结背景 ~~~~ 由于本博主遇到了需要文本转语音的相关需求,经过多方面的调研和研究,市面上的实现这个需求的方法有很多,可以直接通过调取api的方式实现,文本转语音。也可以…...
08前端项目----升序/降序
升序/降序 vue实现升序/降序服务器处理 vue实现升序/降序 用vue实现升序/降序,以及css绘制三角形 <div class"sui-navbar"><div class"navbar-inner filter"><ul class"sui-nav"><li class"active"&g…...
Dataway在Spring Boot中的引入以及使用教程
Dataway是Hasor生态中的接口配置工具,能帮助开发者快速配置数据接口。它支持DataQL和SQL两种语言模式,可将SQL转换为DataQL执行,简化数据查询与交互,无需编写大量代码。接口配置完成后,可进行自测、冒烟测试࿰…...
百度搜索 API 相比于爬虫的效率提升、价格及如何注册使用
使用百度搜索 API 进行数据查询,相比于爬虫(selenium)速度提升的幅度取决于几个因素: 1. 摆脱页面渲染(Selenium) Selenium 通过控制浏览器来模拟用户行为,加载网页并渲染页面。每次请求都需要…...
Docker 中运行 JAR 文件
文章目录 步骤 1:准备文件结构步骤 2:编写 Dockerfile步骤 3:构建 Docker 镜像步骤 4:运行容器常见问题解决Q1:容器启动后立即退出Q2:时区不一致Q3:依赖外部服务(如MySQL)…...
MacOS 10.15上能跑大语言模型吗?
MacOS 10.15上能跑大语言模型吗? 下载安装Ollama运行大语言模型引申出的问题 MacOS 10.15.7(发布于2020年9月)作为已经发布了将近5年的系统版本能够运行当今流行的大语言模型吗?这篇文章简要介绍了在MacOS 10.15上通过Ollama运行d…...
分布式之易混淆概念
昨天写UE写的破防了,忘了写文章,今天补一下分布式的一些概念。😚 在软件架构领域,微服务、领域驱动设计(DDD)和分布式系统是三个高频且容易被混淆的概念。许多开发者误以为它们是“同一件事的不同说法”&a…...
DeepSeek开源引爆AI Agent革命:应用生态迎来“安卓时刻”
开源低成本:AI应用开发进入“全民时代” 2025年初,中国AI领域迎来里程碑事件——DeepSeek开源模型的横空出世,迅速在全球开发者社区掀起热潮。其R1和V3模型以超低API成本(仅为GPT-4o的2%-10%)和本地化部署能力&#x…...
Anaconda 与 Miniconda 的差异详解
Anaconda 与 Miniconda 的差异详解 Anaconda 和 Miniconda 都是 Python 数据科学领域常用的发行版管理工具,它们都基于 conda 包管理系统,但在设计定位和功能组成上有显著区别。 核心差异对比 特性AnacondaMiniconda安装包大小较大 (3GB)较小 (100MB左…...
STM32 中断系统深度剖析
在嵌入式系统开发领域,STM32 系列微控制器凭借其强大的性能和丰富的资源被广泛应用。中断系统作为 STM32 的关键特性之一,能够极大地提升系统的实时响应能力和多任务处理效率。本文将基于 STM32F4 系列芯片,深入剖析中断与外设中断的原理、配…...
List findIntersection getUnion
List findIntersection & getUnion 求两个列表的交集和并集 package zwf;import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List;/*** 列表工具类* * author ZengWenFeng* date 2025.04.22* mobile 13805029595* email 117791303qq.com*/ p…...
【微服务】SpringBoot制作Docker镜像接入SkyWalking详解
目录 一、前言 二、SkyWalking介绍 2.1 SkyWalking是什么 2.2 SkyWalking核心功能 2.3 SkyWalking整体架构 2.4 SkyWalking主要工作流程 三、前置准备 3.1 搭建SkyWalking服务 3.1.1 下载安装包 3.1.2 上传服务器目录 2.1.3 数据库持久化配置说明 3.1.4 启动skywalk…...
豪越科技消防公车管理系统:智能化保障应急救援效率
近期消防车辆管理暴露出的问题,凸显了传统管理模式的不足。在应急救援任务日益繁重的背景下,消防部门对公车管理提出了更高要求。豪越科技针对消防行业特殊需求,研发了专业的消防公车管理系统,通过"线上提交申请-线上审批-线…...
vscode本地docker gdb调试python
背景 最近在部署测试一个工程,不想配环境,拉官方镜像下来跑的,不幸地是,程序运行有点问题。想要debug一下,又不想在终端gdb,想要在vscode中点点点,所以有了下面的一顿配置。 vscode python常用…...
Electron使用WebAssembly实现CRC-32 原理校验
Electron使用WebAssembly实现CRC-32 原理校验 将C/C语言代码,经由WebAssembly编译为库函数,可以在JS语言环境进行调用。这里介绍在Electron工具环境使用WebAssembly调用CRC-32 原理格式校验的方式。 CRC-32 原理校验函数WebAssembly源文件 C语言实现C…...
Java求职面试:从Spring Boot到微服务的全面考核
面试场景: 在某互联网大厂的面试室内,面试官严肃地坐在桌子后面,面前是几本厚厚的技术书籍。而我们的主人公,搞笑的水货程序员赵大宝,则带着他标志性的微笑走进了房间。 第一轮提问: 面试官:…...
Electron主进程渲染进程间通信的方式
在 Electron 中,主进程和渲染进程之间的通信主要通过 IPC(进程间通信)机制实现。以下是几种常见的通信方式: 1. 渲染进程向主进程发送消息(单向) 渲染进程可以通过 ipcRenderer.send 向主进程发送消息&am…...
Spring Boot 主模块 spring-boot 核心技术解析:从启动类到内嵌容器的无缝支持
在现代企业级应用的开发中,构建高效、简洁的应用框架是至关重要的。Spring Boot 作为 Spring 生态系统的重要一员,凭借其“约定优于配置”的理念,极大简化了传统 Spring 应用的开发过程。通过内嵌的容器支持、自动配置功能以及灵活的外部化配…...
盈达科技GEO解决方案:破解AI时代品牌增长困局
盈达科技GEO解决方案:破解AI时代品牌增长困局 ——全域优化策略助力企业抢占生成式AI流量高地 一、客户痛点:AI重构规则下的三大生存危机 1. 信任危机:AI放大负面杀伤力 财务隐患:上市公司因财报误读导致股价波动 产品质量&…...
安宝特科技 | AR眼镜在安保与安防领域的创新应用及前景
随着科技的不断进步,增强现实(AR)技术逐渐在多个领域展现出其独特的优势,尤其是在安保和安防方面。AR眼镜凭借其先进的功能,在机场、车站、海关、港口、工厂、园区、消防局和警察局等行业中为安保人员提供了更为高效、…...
蓝牙 6.0 发布,解锁无线科技新可能
在5G和Wi-Fi 7高速发展的时代,蓝牙技术始终以独特优势深度融入日常生活。从无线耳机到智能家居,它凭借低功耗、高兼容的特性,悄然连接各类智能设备,打造无缝的数字生活体验。无论是聆听音乐、智能门禁还是健康监测,蓝牙…...
redis数据类型-地理空间GEO
redis数据类型-地理空间GEO 文档 redis单机安装redis常用的五种数据类型redis数据类型-位图bitmapredis数据类型-基数统计HyperLogLog 说明 官网操作命令指南页面:https://redis.io/docs/latest/commands/?nameget&groupstring 地理空间:GEO …...
2023蓝帽杯初赛内存取证-5
直接查找关键词”xlsx“,但是使用filescna失败了,换成mftparser倒是成功: vol.py -f memdump.mem --profile Win7SP1x64 filescan | grep -E "xlsx" vol.py -f memdump.mem --profile Win7SP1x64 mftparser | grep -E "xlsx&…...
安宝特方案 | 医疗AR眼镜,重新定义远程会诊体验
【AR眼镜:重新定义远程会诊体验】 在快速发展的医疗领域,安宝特医疗AR眼镜以其尖端技术和创新功能,引领远程会诊的未来,致力于为为医生和患者带来更高效、精准和无缝的医疗体验。 探索安宝特医疗AR眼镜如何在医疗行业中引领新风潮…...