设为首页 - 加入收藏 - 网站地图 欢迎加QQ群 :14364084
当前位置:谭博的博客 > 数据库 > mongodb > 正文

MongoDB中索引的创建和使用详解(2)

时间:2011-11-07 12:47 来源:MongoDB中索引的创建 标签: 作者:MongoDB中索引的创建 阅读:

导语:MongoDB中索引的创建和使用详解(2)

稀疏索引和稀疏矩阵类似,稀疏索引就是索引至包含被索引字段的文档。

任何一个稀疏的缺失某一个字段的文档将不会存储在索引中,之所以称之为稀疏索引就是说缺失字段的文档的值会丢失。

稀疏索引的创建和完全索引的创建没有什么不同。使用稀疏索引进行查询的时候,某些由于缺失了字段的文档记录可能不会被返回,这是由于稀疏索引子返回被索引了的字段。可能比较难以理解,不过看几个例子就好理解了。


  1. > db.people.ensureIndex({title:1},{sparse:true}) //在title字段上建立稀疏索引  
  2.  
  3. > db.people.save({name:"Jim"})  
  4.  
  5. > db.people.save({name:"yang",title:"prince"})  
  6.  
  7. > db.people.find();  
  8.  
  9. { "_id" : ObjectId("4e244dc5cac1e3490b9033d7"), "name" : "Jim" }  
  10.  
  11. { "_id" : ObjectId("4e244debcac1e3490b9033d8"), "name" : "yang", "title" : "prince" }  
  12.  
  13. > db.people.find().sort({title:1})//自有包含有索引字段的记录才被返回  
  14.  
  15. { "_id" : ObjectId("4e244debcac1e3490b9033d8"), "name" : "yang", "title" : "prince" }  
  16.  
  17. > db.people.dropIndex({title:1})//删除稀疏索引之后,所有的记录均显示  
  18.  
  19. { "nIndexesWas" : 2, "ok" : 1 }  
  20.  
  21. > db.people.find().sort({title:1})  
  22.  
  23. { "_id" : ObjectId("4e244dc5cac1e3490b9033d7"), "name" : "Jim" }  
  24.  
  25. { "_id" : ObjectId("4e244debcac1e3490b9033d8"), "name" : "yang", "title" : "prince" } 

唯一索引

MongoDB支持唯一索引,这使得不能插入在唯一索引项上已经存在的记录。例如,要保证firstname和lastname都是唯一的,命令如下

 


  1. > db.things.ensureIndex({firstname:1,lastname:1},{unique:true}) 

缺失的键

当一个文档以唯一索引的方式保存到集合中去的时候,任何缺失的索引字段都会一null值代替,因此,不能在唯一索引上同时插入两条缺省的记录。如下:


  1. >db.things.ensureIndex({firstname: 1}, {unique: true});  
  2.  
  3. >db.things.save({lastname: "Smith"});  
  4.  
  5. >db.things.save({lastname: "Jones"});// 会产生错误,因为firstname会有两个null. 

重复值:

唯一索引不能够创建在具有重复值的键上,如果你一定要在这样的键上创建,那么想系统将保存第一条记录,剩下的记录会被删除,只需要在创建索引的时候加上dropDups这个可选项即可


  1. >db.things.ensureIndex({firstname : 1}, {unique : true, dropDups : true})  
  2.  
  3. Dropping Indexes 

删除一个特定集合上的索引:


  1. >db.collection.dropIndexes(); 

删除集合中的某一个索引:


  1. db.collection.dropIndex({x: 1, y: -1}) 

也可以直接执行命令进性删除


  1. db.runCommand({dropIndexes:'foo', index : {y:1}})//删除集合foo中{y:1}的索引  
  2.  
  3. // remove all indexes:  
  4.  
  5. db.runCommand({dropIndexes:'foo', index : '*'})//删除集合foo中所有的索引 

重建索引:

可以所用如下命令重建索引:


  1. db.myCollection.reIndex()  
  2.  
  3. // same as:  
  4.  
  5. db.runCommand( { reIndex : 'myCollection' } ) 

通常这是不必要的,但是在集合的大小变动很大及集合在磁盘空间上占用很多空间时重建索引才有用。对于大数据量的集合来说,重建索引可能会很慢。

注:

MongoDB中索引是大小写敏感的。

当更新对象是,只有在索引上的这些key发生变化时才会更新。着极大地提高了性能。当对象增长了或者必须移动时,所有的索引必须更新,这回很慢 。

索引信息会保存在system.indexes 集合中,运行 db.system.indexes.find() 能够看到这些示例数据。

索引的字段的大小有最大限制,目前接近800 bytes. 可在大于这个值的字段上建立索引是可以的,但是该字段不会被索引,这种限制在以后的版本中可能被移除。

索引的性能

索引使得可以通过关键字段获取数据,能够使得快速查询和更新数据。

但是,必须注意的是,索引也会在插入和删除的时候增加一些系统的负担。往集合中插入数据的时候,索引的字段必须加入到B-Tree中去,因此,索引适合建立在读远多于写的数据集上,对于写入频繁的集合,在某些情况下,索引反而有副作用。不过大多数集合都是读频繁的集合,所以集合在大多数情况下是有用的。

使用sort()而不需要索引

如果数据集合比较小(通常小于4M),使用sort()而不需要建立索引就能够返回数据。在这种情况下,做好联合使用limit()和sort()。

关于MongoDB索引的创建和使用就介绍到这里,希望能对各位有所帮助,您的收获将是我最大的快乐!

 

关注微信公众号

微信扫一扫,打赏我

热评文章
    内容不错,支持一下
    评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)