现在的位置: 首页 > 综合 > 正文

MongoDB 笔记之 索引

2013年12月06日 ⁄ 综合 ⁄ 共 1516字 ⁄ 字号 评论关闭

MongoDB 的索引 和常用关系型数据库的索引类似。它就好比是书籍的目录,可以通过目录快速的找到你想要的内容,而不用整本书的去翻找。

创建合理的索引,对数据库查询、排序等性能上的优化会有很大的提升,有时不加索引需要几分钟的数据才能检索出的数据,

在加了索引后可能会在瞬间检索完成。

但是凡事都有利弊,创建索引也有缺点,它会在每次 insert,update,delete 时,额外的在集合的索引中做标记。

//创建索引的方法

db.user.ensureIndex({"user" :1,"date" : -1,...});

//上面的例子中,我们创建了 "user" 和 "date" 的联合索引,第一个参数如 "user" 代表要索引的键,第二个参数, 1 或者 -1 代表索引的方向。

索引的名字

索引默认的名字是以 keyname1_dir1_keyname2_dir2_keyname3_dir3_..._keynameN_dirN 这种形式命名,其中 keynameX 代表字段名字,dirX 代表索引方向(1 或者 -1)。

手动指定索引名字: db.user.ensureIndex({"user" :1,"date" : -1,...},{"name" : "userIndex1"});


单个键的索引,无需考虑索引方向的问题。多个键的话则需考虑索引的方向,根据实际情况合理处理。

创建多条索引的时候,比如, {"user" : 1,"date" : 1,"sex" : 1,"age" : 1}

他会相当于我们创建了   {"user" : 1} 、 {"user"
: 1,"date" : 1}、 {"user" : 1,"date" : 1,"sex" : 1,}、 {"user" : 1,"date" : 1,"sex"
: 1,"age" : 1}  
这些索引,也就是我们在进行这些查询时,会使用索引。

一定不要索引每一个键,这会导致插入非常慢,并且很可能对查询速度提升不大。

例子:查找用户最新的更新状态。

依照我们先前的经验,创建索引  {"user" : 1,"date" : -1}

当查找用户最新的更新状态时,就需要将索引值载入内存,如果数据少的话,可能没有太大问题。但是如果数据非常之多,并且我修改的用户名为 z 开头的,那么我必须载入到最后的索引,由于数据太多,内存放不下所有的索引,就会非常的慢。

但是我们改变一下索引的顺序: {"date" : -1,"user" : 1}

试想一下,所有的最新数据都是在最前面的,我们查找最新状态的时候,基本上不会用到之前很早的数据,而且在更新索引的时候也会很方便。

这就好比我们通过书籍目录查找内容时,如果我们要查找的目录在最前面,那么在翻看第一页目录的时候就可以找到了。

内嵌文档键的索引

与一般索引的创建方法一样  db.user.ensureIndex({"hoby.book" :1});

为排序创建索引

如果数据量非常大,那么对大量数据排序的索引创建是非常有必要的。因为在做无索引的排序时,需要将所有的数据加载到内存进行排序,这样就不可能对T级的数据做排序,此时,MongoDB 就会报错。

唯一索引

db.user.ensureIndex({"name" :1},{"unique":true});

唯一索引相当于 关系型数据库中的唯一约束,他可以保证该键的值是惟一的。在创建 键的唯一索引之前,应确保该集合中改建的值是无重复的,否则会报错。

消除重复

db.user.ensureIndex({"name" :1},{"unique":true,"dropDups":true});

他的作用是,保留第一个文档,删除余下的有重复值的文档。需谨慎。

复合唯一索引

方法同创建唯一索引一样,创建时,单个键的值可以相同,只有所有键的值组合起来不同就可以。



抱歉!评论已关闭.