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 显示所有候选计划的执行信息
这个方法会返回查询语句使用的是那个索引、查询时间、扫描文档数量等常见信息可以作为索引优化的依据