MongoDB索引及其原理

目录

索引原理

索引类型

单键索引

组合索引

特性索引

唯一索引

稀疏索引

部分索引

TTL索引

多键索引

文本索引

地理空间索引

哈希索引

总结

[MongoDB 索引执行计划](#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 显示所有候选计划的执行信息

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

相关推荐
越来越无动于衷22 分钟前
基于 JWT 的登录验证功能实现详解
java·数据库·spring boot·mysql·mybatis
看天走路吃雪糕25 分钟前
墨者:SQL手工注入漏洞测试(MySQL数据库-字符型)
数据库·mysql·sql注入·sqlmap·墨者学院·字符型注入
柊二三5 小时前
XML的简略知识点
xml·数据库·oracle
每天敲200行代码7 小时前
MySQL 事务管理
数据库·mysql·事务
程序员勋勋18 小时前
Redis的String数据类型底层实现
数据库·redis·缓存
不修×蝙蝠8 小时前
MySQL 全详解:从入门到精通的实战指南
数据库·mysql·索引·最左前缀
我的ID配享太庙呀10 小时前
Django 科普介绍:从入门到了解其核心魅力
数据库·后端·python·mysql·django·sqlite
不辉放弃11 小时前
kafka的消费者负载均衡机制
数据库·分布式·kafka·负载均衡
拉姆哥的小屋11 小时前
用 Flask 打造宠物店线上平台:从 0 到 1 的全栈开发实践
数据库·oracle·flask