设为首页 收藏本站
查看: 1330|回复: 0

[经验分享] mongodb 索引相关

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-1-21 09:18:47 | 显示全部楼层 |阅读模式
1.索引的相关介绍:
monggodb的索引也是一颗平衡二叉树,所以在传统数据库中的绝大部分的索引优化技术也是可用的.
注意:mongodb可以在任意方向上对数据进行遍历(这点和关系数据库中的索引不一样),但这个仅限于单键排序,对于多键排序索引的方向还是比较重要的.
下面是个单键排序无方向性的具体的例子:
wKioL1S-FKuSfNiNAAL2NwS7sS0273.jpg

上面是两个查询的执行计划,红色部分的参数表示,查询是否在内存中有排序操作,
从上面的例子中可以很明显的看出,无论是按照iage的降序还是升序排序,查询都没有在内存中有排序操作.

2.mongodb 中的索引类型比较多,我这里仅仅列出比较常见的索引类型,更多的索引类型,参见http://www.iyunv.com/xinghebul ... /12/19/2293043.html

唯一索引:它保证跟已有文档的索引关键字重复的文档不会被插入
wKiom1S-E_Tj_LFHAAF35HMBqPM293.jpg

上面的的例子中已成功创建一个唯一索引.


复合唯一索引:多个键值组合的唯一索引。
复合唯一索引实例:
wKioL1S-FNij4wS5AAJK8IID8R4423.jpg

创建唯一索引的注意事项:
(1)唯一索引和不存在的关键字:
当保存到集合中的文档在索引字段没有值的话,它的索引字段会被赋值为null然后插入。就是说,你不可能在唯一索引中插入多个在某个索引字段都没有值的文档。(多个null值被认为是相等的值)
以下实例在唯一索引字段上插入多个null值报错.
wKiom1S-FBrAig-YAAMU74pKWqA513.jpg


(2).对已经存在的重复值的字段创建唯一索引.
   如果直接创建唯一索引肯定是会报错的.
wKiom1S-FDzyFAilAAEgTGCNdoY648.jpg

(3).如果一定要在这样的字段上创建唯一索引,可以在创建唯一索引的时候指定一个关键字dropDups来强制创建索引.但是这种创建索引的方法会删除集合中的数据,所以不建议使用这种方法。

使用dropDups强制创建索引范例:
wKioL1S-FVag8eprAAHuXAfnG7Q003.jpg


稀疏索引:在mongdo的集合中,每个文档的键值对可以不一样(行的列数不一样),那么在一个索引中,字段可能在某个文档中,也有可能不在某个文档中,当字段不在某个文档中的时候,查询利用索引得到数据时默认情况下会将没有这个字段的文档查询出来.
wKiom1S-FJHDFY6cAASlHYLKG0M542.jpg
以上实例中的查询,通过索引iage 得到了数据,但是将不包含iage字段的文档也查询出来了,  
这个时候可以通过稀疏索引将那些没有包含索引字段的文档过滤掉.

以下是一个通过稀疏索引过滤不包含索引字段的的文档的例子:
从执行计划中可以看到,查询是通过稀疏索引得到数据的,并且查询出来的结果集中全部包含iage字段(过滤掉了没有包含iage的文档).
wKioL1S-FXiyBOE2AARx-3yu1BU730.jpg

3.索引管理:
查看制定集合下的索引信息       :db.collection.getIndexes();
查看当前架构下的所有索引信息   :db.system.indexes.find({});
创建索引:db.collection.ensureIndex({key:1}},{unique:true,dropDups:true});
hint({}):强制使用某个键值(索引)
删除索引:db.collection.dropIndexes() ,db.collection.dropIndex(index)
重建索引:db.test.reIndex()
标识索引: db.collection.ensureIndex({key:1}},{name:"Index_name"});  

(1):查看指定集合的所有索引:db.colleciton.getIndexes();
wKioL1S-FYfA5MyUAADZcAkoZZQ775.jpg


(2)查看当前架构下的所有索引信息   :db.system.indexes.find({});
wKioL1S-FZHQOjdaAAFcTddqdi8498.jpg

(3)创建索引:db.collection.ensureIndex({key:1},{unique:true,dropDups:true,sparse:true})
  上面是创建索引的标准语法,第二个大括号({unique:true,dropDups:true,sparse:true})为索引类型参数。
  Unique:表示唯一索引。
  Sparse:表示稀疏索引.
  dropDups:当索引字段中存在重复值时,强制删除重复的文档,该参数会丢失数据,不建议使用该参数.

(4)hint({}):强制使用某个键值(索引)
下面实例中,从执行计划可以看出,强制使用索引了。

wKiom1S-FMnyviNCAAOG-medeHc284.jpg


(5).删除索引:db.collection.dropIndexes() ,db.collection.dropIndex(index)

  db.collection.dropIndexes():删除集合下面的所有索引.

wKiom1S-FNSjrbcvAAEf2nz6nPU529.jpg

集合test下面已经没有可删除的索引,_id_ 是系统自带的索引,无法手动删除.

  db.collection.dropIndex(index_name):删除指定索引
   wKiom1S-FOjD4ubCAAHTBKjG_xQ103.jpg


(6).当索引效率低下的时候(可能是碎片较多),就需要重建索引了。db.test.reIndex() 。
  db.test.reIndex():重建索引
wKioL1S-FcaA_VchAAJvwOH6paU697.jpg

重建单个索引或是 集合下的所有索引。


4.执行计划解读:
正确解读一个查询的执行计划是优化查询的第一步,所以必须准确的读懂查询的执行计划:
wKiom1S-FQTx3vS4AAkNXIQuIek588.jpg



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-41197-1-1.html 上篇帖子: 【MongoDB学习笔记30】MongoDB的聚合框架 下篇帖子: MongoDB:MapReduce基础及实例
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表