数据库
首页 > 数据库> > MongoDB索引

MongoDB索引

作者:互联网

B+树索引
概念:平衡版本的多叉树,并且节点中不存储数据,只存储序号。因为节点中存储数据,所以每个节点可以存储大量元素,使得树的结构更矮。经过更少次数的磁盘IO就能找到想找到的数据,效率高。
单键索引:基于主键ID进行的B+树结构;
复合索引:与mysql的复合索引几乎一致,只能按顺序查找。
默认的id索引:即使由两个客户端创建也能有效的防止id的重复。
创建索引
db.collection.createIndex(keys, options)
在这里插入图片描述
创建单键索引:db.lyd.createIndex({name:1});

1为正序,-1为倒序,对于单键索引而言正序或者倒序并没有什么差别;
查看当前表的索引:db.lyd.getIndexes();
在这里插入图片描述
索引命名如果我们创建的索引为降序的那么他的名字默认为name_-1
也可以为索引加上名字比如我们创建一个age’的索引db.lyd.createIndex({age:1},{name,“agedeName”});方便别人知道我们这个索引是用于做什么的。
删除索引:db.lyd.dropIndex(“agedeName”);
db.lyd.dropIndex({name:1});
主键索引我们是不能删除的。
索引分析
db.lyd.explain().find({name:“xx”});
我们需要关注winningPlan 最优的计划
winningPlan: stage 的值含义
COLLSCAN: 整个集合扫描
IXScan: 索引扫描
FETCH: 根据索引指向的文档的地址进行查询
SORT: 需要再内存中排序,效率不高(不可取,需要优化)在这里插入图片描述
IXScan完后还要FETCH
意思就是索引查找完毕后,根据索引给出的地址去磁盘中寻找该数据;
可以根据映射优化,跟mysql中的覆盖索引一样,就是查找中的所有字段在索引中都存在那么直接在索引中一次查询出所有结果即可。这时更快的方式;
db.lyd.explain().find({name:“xx”},{_id:0,name:1});
可以看出只有IXScan,不需要回表扫描了。这样速度能够更快。
PROJECTION_COVERED表示索引覆盖
在这里插入图片描述

在这里插入图片描述

创建复合索引:db.lyd.createIndex({name:1,age:1})
因为这个复合索引取的值都是1,那么该索引先按照name升序排列,再按照age升序排列;
在这里插入图片描述
复合索引查询:
db.lyd.explain().find().sort({name:1,age:-1})
如果我们升序查询数据,并且age为-1的时候,其stage为SORT,需要在内存中重新排序,效率低下,因为我们创建的索引为name:1,age:1;这边查询的顺序对不上也会导致利用不到索引,除非创建一个name:1,age-1的索引才会使用到索引,效率会变高很多。避免了在内存中排序。
在这里插入图片描述
db.lyd.explain().find().sort({name:1,age:1}) 使用索引成功,效率高
在这里插入图片描述

创建多键索引
索引的唯一性
唯一键索引和mysql中是一样的,如果该值已经出现了重复会不能创建该索引。
db.lyd.createIndex({age:1},{unique:true});
复合索引也能够创建唯一索引。
稀疏索引
如果使用唯一性索引,那么为空的字段,或者字段缺失只能有一个。唯一性索引配合稀疏索引使用后,可以允许索引字段可以有多个缺失。
这时我们创建稀疏索引,并且和唯一索引配合使用时才有效果;
db.lyd6.createIndex({name:1},{sparse:true,unique:true})
索引的生存时间
过了生存时间,就把该条数据删除掉,需要有日期字段
db.lyd7.createIndex({ create_time: 1},{expireAfterSeconds:30 });
复合键索引不具备生存时间的特性
当索引键是包含日期元素的数组字段时,数组中最小的日期将被用来计算文档是否已经过期
数据库使用一个后台线程来监测和删除过期的文档,删除操作可能会有一定的延迟

标签:name,MongoDB,age,db,lyd,索引,createIndex
来源: https://blog.csdn.net/qq_42001445/article/details/114001841