MongoDB:mongodb的索引操作

标签: mongodb mongodb 索引 | 发表时间:2013-12-23 23:11 | 作者:jessonlv
出处:http://blog.csdn.net

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

作者:jessonlv 发表于2013-12-23 15:11:47 原文链接
阅读:0 评论:0 查看评论

相关 [mongodb mongodb 索引] 推荐:

MongoDB 索引

- - 博客园_首页
索引是用来加快查询的,数据库索引与数据的索引类似,有了索引就不需要翻遍整本书,数据库可以直接在索引中查找,. 使得查询速度很快,在索引中找到条目后,就可以直接跳转到目标文档的位置.. 要掌握如何为查询配置最佳索引会有些难度.. MongoDB索引几乎和关系型数据库的索引一样.绝大数优化关系型数据库索引的技巧同样适用于MongoDB..

MongoDB索引内部实现

- Rehtron - NoSQLFan
在数据库优化中,索引优化是非常重要也是每一个数据库使用者必须了解的. MongoDB的索引采用BTree结构,除了其地理位置索引外,数据索引本质上和MySQL 的 BTree索引没有什么差别. 下面是一个接近200页的PPT,对MongoDB读写操作相关的索引操作进行了图文讲解. 如果你对数据库索引的实现原理感兴趣,可以仔细看看.

MongoDB索引实战技巧

- - NoSQLFan
本文内容源自 Kyle Banker 的 MongoDB In Action一书. 主要描述了MongoDB 索引相关的一些基础知识和使用技巧. 虽然MongoDB的索引在存储结构上都是一样的,但是根据不同的应用层需求,还是分成了唯一索引(unique)、稀疏索引(sparse)、多值索引(multikey)等几种类型.

MongoDB中索引的用法

- - 数据库 - ITeye博客
本文是一篇转载文章,作者在对 MongoDB文档进行了细致的阅读后,总结出了MongoDB的各种索引的用法. 原文链接: http://iamcaihuafeng.blog.sohu.com/151638529.html. 索引能提高检索数据的速度,你可以想像成在MySQL中创建索引一样,同样索引也是用B-Tree也实现的.

关于Mongodb索引实战

- - snoopyxdy的博客
最近碰到这样的一个需求,一张酒店政策优惠表,我们要根据用户入住和离开的时间,计算一家酒店的最低价政策前10位,数据库表字段如下:. 'hid':88,     酒店id. 'date':20150530,  入住日期整形(不要纠结unix时间戳). 'enable':1,  政策是否启用. 'price':100, 政策价格.

[mongodb] java操作mongodb

- - 数据库 - ITeye博客
           //实例化Mongo对象,连接27017端口.                               //连接名为yourdb的数据库,假如数据库不存在的话,mongodb会自动建立. //从Mongodb中获得名为yourColleection的数据集合,如果该数据集合不存在,Mongodb会为其新建立.

mongodb索引讲解与性能调优

- - haohtml's blog
mongodb索引规则基本上与传统的关系库一样,大部分优化MySQL/Oracle/SQLite索引的技巧也适用于mongodb. 当查询中用到某些条件时,可以对该键建立索引,以提高查询速度. 如果数据量很多且查询多于更新时,可以用索引提高查询的速度. a)         查询索引:. 查询索引很简单,比如说需要查询mailaccess数据库中的Mail collection上的索引时:.

Dex – MongoDB索引优化工具

- - NoSQLFan
Dex是一个开源的MongoDB 优化工具,它通过对查询日志和当前数据库索引进行分析,向管理员提出高效的索引优化策略. 在监控过程中,dex会通过stderr输出推荐的结果. 我们看到,在输出结果中,有一个shellCommand字段,里面就是添加索引的语句,如果你觉得dex的推荐不错,就可以直接复制这段脚本在 MongoDB上添加索引了.

MongoDB范围查询的索引优化

- - NoSQLFan
我们知道, MongoDB的 索引是B-Tree结构的,和MySQL的索引非常类似. 所以你应该听过这样的建议:创建索引的时候要考虑到sort操作,尽量把sort操作要用到的字段放到你的索引后面. 但是有的情况下,这样做反而会使你的查询性能更低. 比如我们进行下面这样的查询:. 查询条件是 {“country”: “A”},按 carsOwned 字段的正序排序.

【MongoDB】MongoDB之优化器Profiler

- - CSDN博客数据库推荐文章
在mysql数据库中,慢查询日志经常作为优化数据库的依据, mongodb中依然有类似的功能. Mongodb自带的profiler,可以方便地记录所有耗时的操作,以便于调优;. 一、开始profiler功能. 开启profier功能有两种:. 第一种就是直接在启动参数里面进行设置,就在茄冬mongodb时候添加-profile=级别.