mongodb 索引相关

1.索引的相关介绍:

monggodb的索引也是一颗平衡二叉树,所以在传统数据库中的绝大部分的索引优化技术也是可用的.

注意:mongodb可以在任意方向上对数据进行遍历(这点和关系数据库中的索引不一样),但这个仅限于单键排序,对于多键排序索引的方向还是比较重要的.

下面是个单键排序无方向性的具体的例子:

上面是两个查询的执行计划,红色部分的参数表示,查询是否在内存中有排序操作,

从上面的例子中可以很明显的看出,无论是按照iage的降序还是升序排序,查询都没有在内存中有排序操作.

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

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

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

复合唯一索引:多个键值组合的唯一索引。

复合唯一索引实例:

创建唯一索引的注意事项:

(1)唯一索引和不存在的关键字:

当保存到集合中的文档在索引字段没有值的话,它的索引字段会被赋值为null然后插入。就是说,你不可能在唯一索引中插入多个在某个索引字段都没有值的文档。(多个null值被认为是相等的值)

以下实例在唯一索引字段上插入多个null值报错.

(2).对已经存在的重复值的字段创建唯一索引.

如果直接创建唯一索引肯定是会报错的.

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

使用dropDups强制创建索引范例:

稀疏索引:在mongdo的集合中,每个文档的键值对可以不一样(行的列数不一样),那么在一个索引中,字段可能在某个文档中,也有可能不在某个文档中,当字段不在某个文档中的时候,查询利用索引得到数据时默认情况下会将没有这个字段的文档查询出来.

以上实例中的查询,通过索引iage 得到了数据,但是将不包含iage字段的文档也查询出来了,

这个时候可以通过稀疏索引将那些没有包含索引字段的文档过滤掉.

以下是一个通过稀疏索引过滤不包含索引字段的的文档的例子:

从执行计划中可以看到,查询是通过稀疏索引得到数据的,并且查询出来的结果集中全部包含iage字段(过滤掉了没有包含iage的文档).

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();

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

(3)创建索引:db.collection.ensureIndex({key:1},{unique:true,dropDups:true,sparse:true})

上面是创建索引的标准语法,第二个大括号({unique:true,dropDups:true,sparse:true})为索引类型参数。

Unique:表示唯一索引。

Sparse:表示稀疏索引.

dropDups:当索引字段中存在重复值时,强制删除重复的文档,该参数会丢失数据,不建议使用该参数.

(4)hint({}):强制使用某个键值(索引)

下面实例中,从执行计划可以看出,强制使用索引了。

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

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

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

db.collection.dropIndex(index_name):删除指定索引

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

db.test.reIndex():重建索引

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

4.执行计划解读:

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

时间: 2024-10-09 20:35:06

mongodb 索引相关的相关文章

mongoDB索引相关命令总结

一.在集合中文档的某个键上面建立索引: 1.我们知道如果索引使用的得当,会大幅提升查询速度,而如果使用不当有可能会使整个操作性能下降所以在建立索引的时候要考虑如下几点: (1).会做什么样的查询,哪些键需要建立索引 (2).每个键的索引方向是怎么样的 (3).如何应对扩展,怎么排序键的方向,使更多常用的数据保存在内存中 2.这里注意一下,建立索引的时候可以使用 1,-1 建立不同方向的索引 3.使用ensureIndex() 在指定的键上创建索引 4.建立普通索引:使用 ensureIndex(

MongoDB 索引相关知识

背景: MongoDB和MySQL一样,都会产生慢查询,所以都需要对其进行优化:包括创建索引.重构查询等.现在就说明在MongoDB下的索引相关知识点,可以通过这篇文章MongoDB 查询优化分析了解MongoDB慢查询的一些特点. 执行计划分析: 因为MongoDB也是BTree索引,所以使用上和MySQL大致一样.通过explain查看一个query的执行计划,来判断如何加索引,explain在3.0版本的时候做了一些改进,现在针对这2个版本进行分析: 3.0之前: zjy:PRIMARY>

MongoDB索引相关文章-摘自网络

索引类型 虽然MongoDB的索引在存储结构上都是一样的,但是根据不同的应用层需求,还是分成了唯一索引(unique).稀疏索引(sparse).多值索引(multikey)等几种类型. 唯一索引 唯一索引在创建时加上unique:true 的选项即可,创建命令如下: db.users.ensureIndex({username: 1}, {unique: true}) 上面的唯一索引创建后,如果insert一条username已经存在的数据,则会报如下的错误: E11000 duplicate

MongoDB 索引的使用, 管理 和优化

MongoDB 索引的使用, 管理 和优化 2014-03-25 17:12 6479人阅读 评论(0) 收藏 举报  分类: MongoDB(9)  [使用explain和hint] 前面讲高级查询选项时,提到过"$explain" 和 ”$hint“可以作为包装查询的选项关键字使用,其实这两个本身就可以作为操作游标的函数调用!游标调用explain函数会返回一个文档,用于描述当前查询的一些细节信息.这也不同于我们前面介绍的游标函数,前面提到的游标处理函数都是返回游标,可组成方法链调

MongoDB(索引及C#如何操作MongoDB)(转载)

MongoDB(索引及C如何操作MongoDB) 索引总概况 db.test.ensureIndex({"username":1})//创建索引 db.test.ensureIndex({"username":1, "age":-1})//创建复合索引 数字1表示username键的索引按升序存储,-1表示age键的索引按照降序方式存储. // 该索引被创建后,基于username和age的查询将会用到该索引,或者是基于username的查询也会

MongoDB索引管理

虽然MongoDB的索引在存储结构上都是一样的,但是根据不同的应用层需求,还是分成了唯一索引(unique).稀疏索引(sparse).多值索引(multikey)等几种类型. 唯一索引 唯一索引在创建时加上 unique:true 的选项即可,创建命令如下: db.users.ensureIndex({username: 1}, {unique: true}) 上面的唯一索引创建后,如果insert一条username已经存在的数据,则会报如下的错误: E11000 duplicate key

MongoDB索引的种类与使用

一:索引的种类 1:_id索引:是绝大多数集合默认建立的索引,对于每个插入的数据,MongoDB都会自动生成一条唯一的_id字段2:单键索引: 1.单键索引是最普通的索引 2.与_id索引不同,单键索引不会自动创建 如:一条记录,形式为:{x:1,y:2,z:3} db.imooc_2.getIndexes()//查看索引 db.imooc_2.ensureIndex({x:1})//创建索引,索引可以重复创建,若创建已经存在的索引,则会直接返回成功. db.imooc_2.find()//查看

菜鸟的mongoDB学习---(六)MongoDB 索引

MongoDB 索引 ps:大概有半个月木有更新了,因为前一阶段的出差和这几天突然来的项目.导致上网时间急剧降低,实在是sorry,以后预计会好一点. 索引通常可以极大的提高查询的效率.假设没有索引.MongoDB在读取数据时必须扫描集合中的每一个文件并选取那些符合查询条件的记录. 这样的扫描全集合的查询效率是很低的,特别在处理大量的数据时,查询能够要花费几十秒甚至几分钟,这对站点的性能是很致命的. 索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中.索引是对数据库表中一列或多列的值进

mysql 索引相关

引言: MYSQL由于其免费和开源的性质,在项目中用处广泛.大家都知道,一个MySQL数据库能够储存大量的数据,如果要在大量的数据中查找某一个数据,如果使用全表检索的话,即费时间又费力气,这时,就需要一种手段来减少这种消耗,这时候,索引就出现了!这里就简要介绍一下MYSQL的索引相关的内容. 索引是啥球东西: 索引的作用就像是相当于图书的目录,可以根据目录中的页码快速找到所需的内容.当表中有大量记录时,若要对表进行查询,第一种搜索方式是全表搜索,将所有记录一一取出,和查询条件进行一一对比,然后返