曲振飞的个人博客

专注于Web全栈开发、APP设计、网站建设

当前位置 : 主页 > 数据库 > MongoDB数据库查询索引

MongoDB数据库查询索引

时间:2017-05-12 19:07:01 栏目:数据库 作者:曲振飞 点击: 286

MongoDB中的索引其实类似于关系型数据库,都是为了提高查询和排序的效率的,并且实现原理也基本一致。由于集合中的键(字段)可以是普通数据类型,也可以是子文档。MongoDB可以在各种类型的键上创建索引。下面分别讲解各种类型的索引的创建。

1._id索引

绝大多数集合默认建立的索引,对于每个插入的数据,MongoDB都会生成一条唯一的_id字段。

例如新创建一个集合时

db.demo_admin2.insert({x:1})
db.demo_admin2.getIndexes() #查看集合索引,可看到_id索引

2.单键索引

单键索引是最普通的索引,单键索引不会自动创建,例如一条记录形式为:{x:1,y:2,z:3},只要在x字段上建立索引之后,就可以用x为条件进行查询

db.demo_admin2.ensureIndex({x:1}) //创建索引
db.demo_admin2.find({x:1}); //使用索引查询

3.多键索引

多键索引与单键索引区别在于多键索引的值具有多个记录,是一个数组

db.demo_admin2.insert({x:[1,2,3,4]})

4.复合索引

当查询条件为多个时,需要建立复合索引

插入记录{'x':1,'y':2,'z':3}

db.demo_admin2.insert({'x':1,'y':2,'z':3});

创建索引

db.demo_3.ensureIndex({x:1,y:1}) #1升序,-1降序

使用{x:1,y:1}作为条件进行查询

db.demo_admin2.find({x:1,y:2})

5.过期索引

指在一段时间后会过期的索引,索引过期后,相应的数据会被删除,适合存储一些在一段时间之后会失效的数据,比如用户登录信息,这好像不需要用到session了,建立索引的时候需要多用一个参数,指定索引的有效时间——expireAfterSeconds,单位为秒

创建过期索引,time-字段,expireAfterSeconds在多少秒后过期,单位:秒

db.imooc_2.ensureIndex({time:1},{expireAfterSeconds:10})
过期索引限制
  • 存储在过期索引字段的值必须是指定的时间类型,必须是ISODate或者是ISODate数组,不能使用时间戳,否则不能被自动删除。

  • 如果指定了ISODate数组,则按照最小的时间进行删除。 过期索引不能是复合索引。

  • 删除时间不是精确的,删除过程是由后台程序每60s跑一次,而且删除也需要一些时间,所以存在误差。

db.demo_3.ensureIndex({time:1},{expireAfterSeconds:30}
db.demo_3.insert({time:new Date()});


实例

下面写个例子测试下建立索引 与 未建立索引的区别,只有在数据量大的时候才有效果

未建立索引,此时删除数据为20秒,每台电脑配置不一样 会有差别。

for(var i=0;i<10000;i++) db.demo_3.insert({b:i})   //插入数据10000条
for(var i=0;i<10000;i++) db.demo_3.remove({b:i})   //删除


建立索引,此时删除数据时间为2秒,在大数据量的时候差别还是很大的

for(var i=0;i<10000;i++) db.demo_3.insert({b:i})   //插入数据10000条
db.demo_3.ensureIndex({b:1}) //插入成功后立即建立索引
for(var i=0;i<10000;i++) db.demo_3.remove({b:i})   //删除


关键字: MongoDB索引,复合索引

关于站长

曲振飞,一个热忠、从事于互联网的90后青年.专注于网站建站、网站设计及优化.以用户体验、WEB标准为主旨,将网站的整体设计与网页设计的相关原理紧密结合.