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

[经验分享] MongoDB:mongodb的索引操作

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2013-12-24 09:24:17 | 显示全部楼层 |阅读模式

对于数据库而言,无非就是增删改查,通常我们在项目应用中,READ操作又占50%以上的操作,客户往往对此也比较敏感,如果在这方面,效率上处理不好,往往是要遭后人唾弃的!所以这时就需要索引来发挥作用了,下面我们先看一下索引给我们带来的感官上的区别,然后我们再详细说说mongodb的索引操作!

一、首先,我们向数据库中插入10万条数据:




  • for(var i=0;i<100000;i++){  
  •     var index=parseInt(i*Math.random());  
  •     db.person.insert({"name":"jessonlv"+i,"age":i});  
  • }  


SouthEast.jpg

然后我们查找第一万条数据的数据,即名字为  jessonlv10000的。注意在此之前,我们没有为person建立索引,另外mongodb为我们提供了explain关键字,使我们可以进行分析操作。




  • db.person.find({"name":"jessonlv"+10000}).explain()  

SouthEast.jpg


cursor :"BasicCursor"的意思是表查找的时候,采用的是表扫描,也就是顺序查找,呵呵,顺序查找。

nscanned:这个的意思是查找操作一共浏览了10万的数据(文档),也就是整个表的文档数量。有点感觉了吧。

millis:这是我们最关心的时间了,一共用了66毫秒。凑合!有点夸张,我们可以做的更好。

二、建立索引:




  • 建立索引  
  • db.person.ensureIndex({"name":1})  
  • db.person.find({"name":"jessonlv"+10000}).explain()  


SouthEast.jpg

建立索引后,我们再对比下建立索引之前的参数值,一共查找了一个文档,所用时间竟然是离谱的0(其实不可能是零了,只是速度太快了),至此,大家应该感受到这种冰火两重天了吧......

三、唯一索引

mongodb的操作是这样的:




  • db.person.ensureIndex({"name":1},{"unique":true})  

重复的键是不能插入的

四、组合索引




  • 组合索引  
  • db.person.insert({"name":"je","age":26,"birthday":"1986-5-4"})  
  • db.person.insert({"name":"jes","age":26,"birthday":"1986-4-4"})  
  • db.person.insert({"name":"jess","age":26,"birthday":"1986-3-4"})  
  • db.person.insert({"name":"jesso","age":26,"birthday":"1986-2-4"})  
  • db.person.insert({"name":"jessonlv","age":26,"birthday":"1986-1-4"})  
  •   
  • 建立索引:  
  • db.person.ensureIndex({"name":1,"birthday":1})  
  • db.person.ensureIndex({"birthday":1,"name":1})  
  • db.person.getIndexs()  


SouthEast.jpg

在此,我们采用查询的时候,优化器会采用最优的索引去查询




  • db.person.find({"birthday":"1986-5-4","name":"jes"}).explain()  




SouthEast.jpg

因为我们做查询时,查询优化器会使用我们建立的这些索引来创建查询方案,如果某一个先执行完则其他查询方案被close掉,这种方案会被mongodb保存起来,当然如果非要用自己指定的查询方案,这也是可以的,在mongodb中给我们提供了hint方法让我们可以暴力执行。

SouthEast.jpg

五、删除索引

我们的业务需求是不断在变化的,那么索引也肯定要根据实际情况而改变,索引是需要维护的,需要将原有的删除然后再建立新的索引。




  • db.person.dropIndexes("1")  

SouthEast.jpg

so....over,下期我将会总结下mongodb的主从复制




运维网声明 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-12205-1-1.html 上篇帖子: 将MongoDB安装成服务 下篇帖子: mongodb基础系列—副本集具体搭建以及解说
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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