当前位置: 首页 > news >正文

MongoDB索引及其原理

目录

索引原理

索引类型

单键索引

组合索引

特性索引

唯一索引

稀疏索引

部分索引 

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.lryc.cn/news/602007.html

相关文章:

  • Java#包管理器来时的路
  • k8s的权限
  • Windows|CUDA和cuDNN下载和安装,默认安装在C盘和不安装在C盘的两种方法
  • C++ 中实现 `Task::WhenAll` 和 `Task::WhenAny` 的两种方案
  • Android启动时间优化大全
  • i节点学习
  • JavaScript核心概念全解析
  • Flutter中 Provider 的基础用法超详细讲解(二)之ChangeNotifierProvider
  • Vim 编辑器工作模式及操作指南
  • Spring AI 项目实战(二十一):Spring Boot + AI +DeepSeek驱动的智能题库系统(附完整源码)
  • zabbix-agent静默安装
  • @RefreshScope 核心原理深度解析:Spring Boot 的动态魔法
  • 抗辐照芯片在低轨卫星星座CAN总线通讯及供电系统的应用探讨
  • 第二阶段-第二章—8天Python从入门到精通【itheima】-138节(MySQL的综合案例)
  • 【程序员私房菜】python洋葱炒王中王火腿肠
  • 数据结构基础内容(第二篇:线性结构)
  • 【LeetCode刷题指南】--设计循环队列
  • 自由学习记录(74)
  • 【LeetCode 热题 100】51. N 皇后——回溯
  • c语言结构体字节对齐
  • EPOLLONESHOT 深度解析:Linux epoll 的单次触发机制
  • LeetCode 1577.数的平方等于两数乘积的方法数
  • 详解力扣高频SQL50题之180. 连续出现的数字【困难】
  • Spring MVC设计精粹:源码级架构解析与实践指南
  • 网络基础19:OSPF多区域实验
  • 俄罗斯方块游戏开发(面向对象编程)
  • Python-初学openCV——图像预处理(四)——滤波器
  • Redis6.0+安装教程(Linux)
  • vscode找不到python解释器的解决方案
  • VINS外参精确自标定飘的问题