目录

索引原理

索引类型

单键索引

组合索引

特性索引

唯一索引

稀疏索引

部分索引 

TTL索引

多键索引

文本索引

地理空间索引

哈希索引

总结

MongoDB 索引执行计划


索引原理

MongoDB索引的背后的原理和MySQL中的索引原理是差不多的,都是使用B+数来对数据进行管理

索引的运行机制也和MySQL是一样的,也会有回表、覆盖索引这些概念

首先,我们需要知道MongoDB的文档本质上就是一个json对象

B+树中叶子节点在MySQL中存的是行数据,在MongoDB中存储的是文档的指针,本质上是一样的

所以,在理解MongoDB索引的原理上,我们可以把MySQL的行类比MongoDB的文档来进行理解,其他都是基本一样的

区别

        MongoDB是自己创建好默认的以_id字段为主键索引,不能指定主键字段

        和MySQL中的索引类型不太一样

下面我将介绍MongoDB中的索引类型,类比MySQL数据库知识进行分享

索引类型

索引大类是分为单键索引和组合索引两大类

通过索引的特性来进行区分,这类叫做特性索引,这些特性索引是和单键索引和组合索引进行组合的

从而形成了各式各样的索引

单键索引

对文档中的单个字段创建索引

作用

        加速对单个字段的查询操作
        支持排序操作
        提高聚合操作的性能

# 创建单键的升序索引
db.集合名.createIndex({ 索引字段: 1 })# 创建单键的降序索引
db.集合名.createIndex({ 索引字段: -1 })

组合索引

对文档中的多个字段创建索引

作用

        加速多字段查询

        优化排序操作

        支持范围查询与等值查询的混合优化

        减少索引数量

# 创建组合索引
# 1 升序   -1 降序
db.集合名.createIndex({ 索引字段1: 1, 索引字段2: -1, 索引字段3: 1 , ...});

特性索引

唯一索引

定义:唯一索引用于保证字段的唯一性,防止插入重复的数据。

# {unique:true}保证了索引的特性是唯一的
# 索引字段 1 升序   -1 降序
db.集合名称.createIndex({索引字段:1}, {unique:true})

稀疏索引

定义: 稀疏索引仅包含具有索引字段的文档的条目,跳过没有索引字段的文档。

# {sparse:true}保证了索引的特性是稀疏索引
# 索引字段 1 升序   -1 降序
db.集合名称.createIndex({索引字段:1}, {sparse:true})

部分索引 

定义: 部分索引仅索引符合特定过滤表达式的文档,减少索引的存储要求和创建维护成本。

# {partialFilterExpression:{查询操作符}}保证了索引的特性是部分索引
# 查询操作符就是为了过滤符合条件的数据建立索引
# 索引字段 1 升序   -1 降序
db.集合名称.createIndex({索引字段:1}, {partialFilterExpression:{查询操作符}})

TTL索引

定义:TTL索引允许在指定时间后自动从集合中删除文档,适用于需要自动过期数据的场景。

# {expireAfterSeconds:存活时间秒级}保证了索引的特性是TTL索引
# 索引字段 1 升序   -1 降序
db.集合名称.createIndex({索引字段:1}, {expireAfterSeconds:存活时间秒级})

多键索引

定义:多键索引是在数组字段上创建的索引,MongoDB会为数组的每个元素创建单独的索引条目。适用于需要查询数组中特定元素的场景。

# 索引数组字段 1 升序   -1 降序
db.集合名.createIndex({ 索引数组字段: -1 })

文本索引

定义:文本索引用于支持全文搜索,可以快速定位包含指定关键词的文档。适用于需要进行全文搜索的场景,如博客文章、商品描述等。一个集合最多支持一个文本索引。

# 索引字段键值对值为text,说明这个是一个全文索引
db.集合名.createIndex({ 索引字段: "text" })

地理空间索引

定义:地理空间索引用于支持地理空间数据查询,可以快速定位地理位置附近的文档。适用于需要根据地理位置进行查询的场景,如查找附近的商家、地点等。

# 索引字段键值对值为2dsphere,说明这个是一个地理位置索引
db.集合名.createIndex({ 索引字段: "2dsphere" })

哈希索引

定义:哈希索引将字段的值通过哈希算法转换为哈希值,并在哈希值上建立索引。适用于需要对字段进行哈希查找的场景,如分片集群中的哈希分片。哈希索引不支持范围查询。

# 索引字段键值对值为hashed,说明这个是一个哈希索引
db.集合名.createIndex({ 索引字段: "hashed" })

总结

上面的特性索引的语法都是按照单键索引类型来进行举例的

按照组合索引类型的特性索引语法就是多填入几个索引字段

具体问题具体分析,特性索引是和单键、组合索引是可以相互配合使用的

MongoDB 索引执行计划

在 MongoDB 中查看索引执行计划通过 explain() 方法来实现的

查询语句的末尾调用.explain()方法就可以看到这个查询语句的索引执行计划

和MySQL差不多

MongoDB中的explain()方法是有参数控制的

queryPlanner                   (默认)          显示查询计划选择过程
executionStats                                         包含查询计划选择和执行统计信息
allPlansExecution                                     显示所有候选计划的执行信息

这个方法会返回查询语句使用的是那个索引、查询时间、扫描文档数量等常见信息可以作为索引优化的依据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/90827.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/90827.shtml
英文地址,请注明出处:http://en.pswp.cn/web/90827.shtml

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

相关文章

学习嵌入式的第三十三天-数据结构-(2025.7.25)服务器/多客户端模型

服务器/多客户端模型循环服务器 while(1){ accept(); recv(); } 适用于简单任务,如基础Web服务器,但无法处理并发请求。并发服务器 通过thread或fork实现多任务处理。需注意子进程/线程的资源回收,避免内存泄漏。多路IO模型服务器 使用select…

【Canvas与标牌】优质资产六角星标牌

【成图】【代码】<!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>优质资产六角星标记 Draft1</title><style type"text/cs…

扫雷游戏开发教程:从零打造精美像素扫雷

完整源码在本文结尾处一、游戏概述 扫雷是一款经典的益智游戏&#xff0c;玩家需要在不触发地雷的情况下揭开所有安全格子。本教程将带你从零开始开发一个具有精美界面和动画效果的扫雷游戏&#xff0c;包含难度选择、棋盘大小调整等高级功能。 二、游戏核心功能 三种难度级别&…

Linux驱动开发笔记(五)——设备树(上)

内容详见《【正点原子】I.MX6U嵌入式Linux驱动开发指南》四十三章 开发板&#xff1a;imx6ull mini 虚拟机&#xff1a;VMware17 ubuntu&#xff1a;ubuntu20.04 一、什么是设备树 视频&#xff1a;第6.1讲 Linux设备树详解-什么是设备树&#xff1f;_哔哩哔哩_bilibili 对…

【QT入门到晋级】window opencv安装及引入qtcreator(包含两种qt编译器:MSVC和MinGW)

前言 本文主要分享QT的两种编译器环境&#xff08;MSVC和MinGW&#xff09;下&#xff0c;安装及引入opencv的方法。 编译器区别 特性​​​​MSVC​​​​MinGW​​​​编译器类型​​微软专有编译器&#xff08;cl.exe&#xff09;基于GCC的开源工具链​​平台支持​​仅Wi…

字节跳动Coze Studio开源了!架构解析

Coze Studio 是字节跳动推出的一款 AI 应用开发平台&#xff0c;专注于帮助开发者快速构建、测试和部署基于大语言模型的智能应用。其整体架构围绕“低代码开发 AI 应用”的核心目标设计&#xff0c;融合了模型能力、工具集成、流程编排和多端部署等功能。以下是其整体架构的详…

Claude 4.0 终极编程指南:模型对比、API配置与IDE集成实战

Claude 4.0 终极编程指南&#xff1a;模型对比、API配置与IDE集成实战 基于官方文档及可验证数据源&#xff08;2025年7月更新&#xff09; 1 Claude 4.0 技术解析&#xff1a;对比竞品的核心优势与局限 1.1 官方性能数据&#xff08;来源&#xff1a;Anthropic技术白皮书&…

优化:Toc小程序猜你喜欢功能

引言&#xff1a;来自自创的小程序中热点接口&#xff0c;本小程序专为在校学生自提点餐使用 一、功能描述 该功能作为一个推荐的职责&#xff0c;根据用户最近行为给用户推荐用户可能喜欢去吃的店铺&#xff0c;可能比较简洁&#xff0c;但是需要设计的方面挺多的&#xff0c…

Datawhale AI 夏令营:让AI理解列车排期表 Notebook(Baseline拆解)

Step1、读取数据 import pandas as pd import requests import re import json from tqdm import tqdm# 读取数据 data pd.read_excel(data/info_table.xlsx) data data.fillna(无数据) dataStep2、注册硅基流动https://cloud.siliconflow.cnQwen/Qwen3-8B 模型可以免费使用&…

vue写的app设置角标

原生App角标&#xff08;UniApp示例&#xff09;调用plus.runtime.setBadgeNumber方法设置安卓/iOS角标&#xff1a;javascriptCopy Code// 设置角标 plus.runtime.setBadgeNumber(99); // 清除角标&#xff08;部分平台需特殊处理&#xff09; plus.runtime.setBadgeNumber(0)…

GAN/cGAN中到底要不要注入噪声

MelGAN论文MelGAN针对的是从mel谱生成语音&#xff0c;里面说当条件很强的时候&#xff0c;随机噪声就没啥用了&#xff0c;因此没将noise注入到生成器中&#xff1b;运用的判别器也仅有1个输入&#xff0c;不是cGAN的形式image-to-image translation with conditional adversa…

备份一下我的 mac mini 的环境变量配置情况

export PATH“/opt/homebrew/bin:$PATH” #THIS MUST BE AT THE END OF THE FILE FOR SDKMAN TO WORK!!! export SDKMAN_DIR“HOME/.sdkman"[[−s"HOME/.sdkman" [[ -s "HOME/.sdkman"[[−s"HOME/.sdkman/bin/sdkman-init.sh” ]] && so…

JVM学习日记(十)Day10

G1回收器 这一篇是详细说明G1回收器的&#xff0c;因为他相对来说确实是个缝合怪&#xff0c;上篇的内容又太多了所不清楚&#xff0c;所有这一篇进行详细的说明&#xff0c; 第一个呢就是其实G1是兼顾并行和并发的&#xff0c;简单来说就是既可以并行也可以并发&#xff0c;…

使用IP扫描工具排查网络问题

随着企业的发展&#xff0c;网络中会新增各类设备&#xff0c;从台式机、服务器到物联网设备和虚拟机&#xff08;VMs&#xff09;&#xff0c;所有这些设备都通过复杂的子网和虚拟局域网&#xff08;VLAN&#xff09;相连。 这种复杂性给 IT 团队带来了压力&#xff0c;他们需…

Wireshark TS | 发送数据超出接收窗口

前言 来自于测试中无意发现到的一个接收窗口满的案例&#xff0c;特殊&#xff0c;或者可以说我以前都没在实际场景中见过。一开始都没整太明白&#xff0c;花了些精力才算是弄清楚了些&#xff0c;记录分享下。 问题说明 在研究拥塞控制的慢启动阶段时&#xff0c;通过 packet…

C语言自定义数据类型详解(四)——联合体

好的&#xff0c;接下来我们来学习最后一个自定义数据类型——联合体。 一、什么是联合体&#xff1a; 联合体又叫共用体&#xff0c;用关键字union来进行定义。又因为所有的成员变量共用同一段内存空间&#xff08;关于这一点&#xff0c;我们不久就会加以验证&#xff09;&…

[python][flask]Flask-Login 使用详解

1. 简介Flask-Login 是 Flask 的一个扩展&#xff0c;专门用于处理用户认证相关的功能。它提供了用户会话管理、登录/注销视图、记住我功能等常见认证需求&#xff0c;让开发者能够快速实现安全的用户认证系统。2. 安装与基础配置首先&#xff0c;需要安装 Flask-Login&#xf…

【WebGPU学习杂记】WebAssembly中的relaxed_madd指令到底做了什么?

relaxed_madd 这条指令到底做了什么核心&#xff1a;relaxed_madd 是一个分量级别 (Component-wise) 的操作 首先&#xff0c;最重要的一点是&#xff1a;v128.relaxed_madd<f32>(a, b, c) 不是矩阵乘法。它是一个在三个向量 a, b, c 之间进行的、逐个分量的、并行的融合…

【全新上线】境内 Docker 镜像状态监控

境内 Docker 镜像状态监控&#xff1a;您的 Docker 加速伴侣 在当今云计算和容器化技术飞速发展的时代&#xff0c;Docker 已成为开发者不可或缺的工具。然而&#xff0c;对于身处国内的用户而言&#xff0c;访问境外 Docker Hub 等镜像仓库时常会遭遇网络延迟和连接不稳定的困…

Visual Studio中部署PaddleOCRv5 (借助ncnn框架)

PaddleOCRv5_ncnn PaddleOCRv5 在Visual Studio中进行图片OCR检测&#xff08;ncnn框架open-mobile实现)&#xff0c;尝试对nihui的ncnn-android-ppocrv5检测算法的剥离与移植。 本项目Github链接如下&#xff1a;PaddleOCRv5_ncnn 写在前面 本仓库代码是基于nihui的ncnn-a…