mongodb的索引操作

    在mongodb中,当我们一个集合中的数据量非常大时,比如几百万条数据,如果不使用索引,对数据的查询就会进行全表扫描,这个时候查询的速度就会非常的慢,此时我们就需要为集合建立上索引,从而加快查询的速度。既然索引可以加快我们的查询速度,那么是否为集合的每个字段上都建立索引呢?这个显然是不正确的,虽然索引可以加快我们的查询速度,但是在插入、更新、删除数据时就会相应的变慢,因为此时需要维护索引,因此我们理性的在集合上创建索引。

建立索引的语法:

db.collections.createIndex({

    key1 : 1,  // 表示为key1创建一个正序索引

    key2 : -1 // 表示为key2创建一个倒叙索引

} ,{

 background :true, // true : 表示后台创建索引 false:表示同步创建索引,会阻塞mongodb其余的操作

 unique : true , // true: 表示创建唯一索引  false:表示非唯一。 对于散列索引,该选项无效。

 name : 'index_1', // name 表示指定索引的名字,如果没有指定,mongodb会默认生成一个名字。

 partialFilterExpression :null, // 表示根据某些条件建立索引,比如:为name=5的字段建立索引

 sparse : true, // true: 表示建立稀疏索引,表示只有存在该字段时才在该字段上建立索引 false:不是稀疏索引

 expireAfterSeconds : 10, //表示10秒后,该文档会被删除

 weights : null // 表示权重,全文索引中指定字段的权重,默认情况下是1

 default_language:'zhs', // 全文索引分词的语言,默认情况下是英文

 ......

});

默认的 _id 索引:

对应默认的_id索引,mongodb会默认为此字段加上一个唯一索引,且此索引无法删除。

建立一个单键索引:

db.persons.createIndex({"userId": 1}, {background:true,name:"index_01"});

    上述表示在 userId上建立一个正序索引,在后台进行创建, 索引的名字是 index_01

创建一个复合索引:

db.persons.createIndex({"userId": 1,"age":-1}, {background:true,name:"index_02"})

    注意:1、上述使用了 userId 和 age 创建了一个复合索引。

               2、最多可以使用 31 个字段组合成复合索引

               3、复合索引的创建时字段的顺序是有影响的,比如此时是userId然后是age,那么在进行数据查询时,使用userId查可以使用索引,使用userId和age查也可以使用索引,但是使用age和userId进行查是不会使用索引的。

               4、总结上面的3就是,mongodb的复合索引,支持前缀查找,即查询的字段的顺序如果是创建字段的前缀时,则可以使用索引。比如:userId就是 userId和age的前缀,那么就可以使用索引。

全文索引:

地理位置索引:

查看集合上的索引:

db.persons.getIndexes()

 删除集合上的索引:

// 删除索引名字是 index_01 的索引
db.persons.dropIndex("index_01");
// 删除所有的索引     
db.persons.dropIndexes();

 重新构建索引:

db.persons.reIndex()

    该操作会删除这个集合上所有的索引,然后进行重新构建。

posted @ 2018-04-25 22:14  huan1993  阅读(33)  评论(0编辑  收藏  举报