ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MongoDB索引

2021-02-23 22:30:41  阅读:196  来源: 互联网

标签:name MongoDB age db lyd 索引 createIndex


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有