索引是对数据库表中一列或多列的值进行排序的一种结构,可以让我们查询数据库变得 更快。MongoDB 的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的查询优化技巧。

增加检索的效率. mongodb提供了索引的支持.(越来越倾向于关系型数据库)

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

通常建立索引的, 基本要求, 就是文档的结构要尽可能一致.

普通单列索引

语法:

db.集合名.ensureIndex({键名:1}) # 1是升序 -1是降序

测试代码:

for(var i = 0; i < 200000; i++) {
    db.golang.insert({name:"bashlog"+i, age:i})
}

MongoDB索引(7) Nosql 第1张

第一:先检验一下查询性能

var start = new Date()
db.golang.find({name:"bashlog187654"})
var end = new Date()
end - start

MongoDB索引(7) Nosql 第2张

第二:为name创建索引

db.golang.ensureIndex({name:1})

MongoDB索引(7) Nosql 第3张

第三:再执行第一部分的查询代码可以看出有数量级的性能提升

MongoDB索引(7) Nosql 第4张

多列索引(复合索引)

语法:

db.集合名.ensureIndex({field1:1/-1, field2:1/-1})

对name和age建立复合索引

MongoDB索引(7) Nosql 第5张

可以使用getIndexes()查看索引的创建情况

MongoDB索引(7) Nosql 第6张

该索引被创建后,基于 username 和 age 的查询将会用到该索引,或者是基于 username 的查询也会用到该索引,但是只是基于 age 的查询将不会用到该复合索引。因此可以说, 如果想用到复合索引,必须在查询条件中包含复合索引中的前 N 个索引列。

子文档索引

语法:

db.集合名.ensureIndex({field.subfield:1/-1})

示例:

有如下结构的文档

{name:"诺基亚手机1", price:12.34, desc:{weight:100, area:"lundon"}}
{name:"诺基亚手机2", price:43.21, desc:{weight:200, area:"newYork"}}

要查询weight等于100的文档

db.goods.find({'desc.weight':100})

根据当前示例,我们建立子文档

db.集合名.ensureIndex({'desc.weight':1})

唯一索引

当给某个列添加了唯一索引后,那么这一列的数据就必须是唯一的,如果添加重复数据就回到值报错

语法:

db.集合名.ensureIndex({name:-1},{unique:true})

查看索引

常用命令:

(1)查看当前索引状态:

db.集合名.getIndexes()

(2)详情查看本次查询使用哪个索引和查询数据的状态信息。

explain("executionStats")

MongoDB索引(7) Nosql 第7张

有索引时,查询时间

MongoDB索引(7) Nosql 第8张

删除索引时查询时间

MongoDB索引(7) Nosql 第9张

删除索引

删除单个索引

语法:

db.集合名.dropIndex({field:1/-1})

删除所有索引

语法:

db.集合名.dropIndexes()

注意:在删除所有的索引是,逐渐索引会保留。

重建索引

一个表经过多次修改后,导致表的文件产生空洞,所以文件也是如此。可以通过索引的重建,减少索引文件锁片,并提高索引的效率。

类似MySQL的optimize table 表名

语法:

db.集合名.reIndex()

索引使用注意事项

(1)创建索引的时候,注意1是正序创建索引 -1是倒序创建索引

(2)索引的创建在提高查询性能的同时会影响插入性能,对于经常查询少插入的文档可以考虑用索引

(3)复合索引要注意索引的先后顺序。

(4)每个键全建立索引不一定就能提高性能,索引不是万能的。

(5)在做排序工作的时候如果是超大数据量也可以考虑加上索引用来提高排序的性能。

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄