zoukankan      html  css  js  c++  java
  • MongoDB:mongodb的索引操作

    对于数据库而言,无非就是增删改查,通常我们在项目应用中,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});
    }

     

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

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


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

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

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

    二、建立索引:

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


    建立索引后,我们再对比下建立索引之前的参数值,一共查找了一个文档,所用时间竟然是离谱的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()
    


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

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



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


    五、删除索引

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

    db.person.dropIndexes("1")

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

    原创文章,转载请注明出处:http://blog.csdn.net/jessonlv

  • 相关阅读:
    重新理解js的执行环境和闭包
    给开发插上想象力的翅膀
    Vue源码的初始化以及数据驱动逻辑
    解析Vue源码之前
    前端模块化发展介绍和未来展望
    现代前端框架具备的特征分析及Vue、React对比
    始于Flux的单项数据流发展简单介绍
    用面向对象编程解决常见需求场景
    【Docker】之重启容器相关命令
    【Java】之获取CSV文件数据以及获取Excel文件数据
  • 原文地址:https://www.cnblogs.com/jessonlv/p/4388006.html
Copyright © 2011-2022 走看看