注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

星期五

明天不上班

 
 
 

日志

 
 
关于我

一个特立独行的Java程序员,比较宅,上上网,写博客,听音乐,看电影。

网易考拉推荐
GACHA精选

MongoDB学习笔记(三)  

2011-07-02 22:48:43|  分类: 非关系数据库 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

继续讲索引:
建立索引应注意的问题:

1.那些键会被索引,经常做哪些查询。

2.每个键的索引方向。

3.如何应对扩展。

1.如何创建索引 (上一篇讲过,这里就不举例了)

db.collection_name.ensureIndex({key_name_1:dir_1,key_name_2:dir_2,key_name_3:dir_3, ... ...},{"name":"index_name"})

key_name 对那个键索引 dir 索引方向,也可以为索引起名字 {"name":"index_name"}  默认名字 key_name_dir

也可以建立组合索引(多个key)

2.查询索引

db.system.indexes.find();

db.collection_name.getIndexes(); 

3.删除索引

因为system.indexes是系统保留的collection,无法对其进行插入删除

所以我们使用ensureIndex 和 dropIndexex (删除全部)  dropIndex(index)   (删除指定的索引)

例子

-------------------------------------------------------------------

//演示两方法的用法

> db.monitorData.dropIndexes                  

function () {

    this.resetIndexCache();

    var res = this._db.runCommand({deleteIndexes:this.getName(), index:"*"});

    assert(res, "no result from dropIndex result");

    if (res.ok) {

        return res;

    }

    if (res.errmsg.match(/not found/)) {

        return res;

    }

    throw "error dropping indexes : " + tojson(res);

}

> db.monitorData.dropIndex  

function (index) {

    assert(index, "need to specify index to dropIndex");

    if (!isString(index) && isObject(index)) {

        index = this._genIndexName(index);

    }

    var res = this._dbCommand("deleteIndexes", {index:index});

    this.resetIndexCache();

    return res;

}> db.monitorData.getIndexes()

[

{

"name" : "_id_",

"ns" : "myDB.monitorData",

"key" : {

"_id" : 1

}

},

{

"_id" : ObjectId("4e0c705f4320e34b28cfdf03"),

"ns" : "myDB.monitorData",

"key" : {

"date" : 1

},

"name" : "date_1"

}

]

> db.monitorData.dropIndex("date_1")

{ "nIndexesWas" : 2, "ok" : 1 }

> db.monitorData.getIndexes()       

[

{

"name" : "_id_",

"ns" : "myDB.monitorData",

"key" : {

"_id" : 1

}

}

]

-------------------------------------------------------------------

4.唯一索引

当你为了确保某个键是唯一的,需要使用唯一索引

db.collection_name.ensureIndex({key_name:dir},{"unique":true})

有时唯一索引创建会失败,是因为索引没创建前的数据中有重复数据,我们需要消除掉重复的数据。

db.collection_name.ensureIndex({key_name:dir},{"unique":true,"dropDups":true})

如果数据很重要的话,最好不要这样做

5.使用explain

explain会返回查询使用索引的一些统计信息

例1

-----------------------------------------------------------------------

> db.monitorData.find().explain()   

{

"cursor" : "BasicCursor",

"nscanned" : 478,

"nscannedObjects" : 478,

"n" : 478,

"millis" : 0,

"indexBounds" : {

}

}

-----------------------------------------------------------------------

cursor 没有使用索引

nscanned 查找的文档数

n 返回的文档数

millis 查询时间 (毫秒)

例2

-------------------------------------------------------------------------

> db.monitorData.find({time:{$lt:new Date('Tue Jun 28 2011 19:55:00')}}).explain()

{

"cursor" : "BtreeCursor time_desc_index",

"nscanned" : 58,

"nscannedObjects" : 58,

"n" : 58,

"millis" : 0,

"indexBounds" : {

"time" : [

[

"Thu Jan 01 1970 08:00:00 GMT+0800 (CST)",

"Tue Jun 28 2011 19:55:00 GMT+0800 (CST)"

]

]

}

}

-------------------------------------------------------------------------

使用索引 time_desc_index

  评论这张
 
阅读(262)| 评论(0)
推荐

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017