索引Indexes
索引常常用来大幅度的提升查询的性能。 考虑应用程序的查询种类是非常重要的事情,因此你就要定义相关的索引。
决定了之后,在MongoDB中创建索引是非常简单的。
基础
索引就是collection中一个document指定一个字段值的数据结构。MongoDB查询优化器可以使用这个数据结构快速分类整理以及排序document。一般来说,索引的实现是B-TREE。
在Shell中,你可以使用ensureIndex()来创建索引,并且指定要索引一个或多个字段。
我们在j字段上创建一个索引
你可以使用db.things.getIndexes();来查看索引信息。
默认索引
_id字段默认被添加了索引。这个索引也不能被删除。_id索引是唯一的。Capped Collections并不会默认创建索引。
Embedded Keys
你甚至可以向embedded document的字段创建索引。例子
document做为key索引的字段可以为任意类型,包括了document类型。
也可以创建这个document内字段的组合索引。
数组当索引的键为数组的时候,MongoDB会索引数组中每个元素。 组合索引除了支持单个字段的索引,MongoDB也支持索引多个字段。创建的索引地方法一样,都使用ensureIndex()。但是你可以指定多个字段。
当创建索引的时候,上面的数字1和-1代表着索引的方向。1是升序,-1为降序。如果为单个索引,顺序并无所谓。如果使用组合索引,顺序就非常重要了。
你可以在多个字段创建索引,查询可以用字段子集做为开头来匹配索引。
如果你在a,b,c上创建索引。
Sparse Indexes稀疏索引
1.7.4的新功能。
sparse index就是在一个存在于document的字段上创建的索引。
任何document中不存在这个索引的字段,那么就不会保存在索引中。之所以叫sparse,当没有索引字段的值的时候,document也就丢失了。
Sparse indexes, 不是完整的索引,也和完整索引操作上有所不同。当使用一个sparse index排序,一些document就不会返回了。
只有存在于index中的document才会返回。
你可以把sparse何unique索引结合起来,来给那些没有丢失字段的document加以唯一性约束。
Unique Indexes唯一索引
MongoDB支持唯一索引,保证了插入document的索引值和已存在document索引值不重复。
下面的示例就保证了不会有两个document中的firstname和lastname值相等。
db.things.ensureIndex({firstname: 1, lastname: 1}, {unique: true});
丢失的键
当保存一个不存在唯一索引的字段的document,那么这个字段的值默认为null。但是这种缺失索引字段的document只能插入一次了。
重复的值
一个唯一索引的值是不能重复的。
保存首个document,而要删除其他索引值和它重复的document,添加参数dropDups
db.things.ensureIndex({firstname : 1}, {unique : true, dropDups : true})
在后台创建索引
创建一个索引,默认的情况会阻塞其他数据库的操作。在1.3.2+版本,支持后台创建索引
background index build option .
删除索引删除指定collection的索引语句为
删除一个单独的索引
直接运行一个命令
重新索引reIndex会重新创建索引
一般来说用不上。如果collection大小增长太快或者索引占用空间看起来很大,就可以使用reIndex。 修复数据库会重新创建索引。 额外要注意的
索引的性能
索引主要用于查询,也包括了排序,非常的快。通过索引查找的document更新也是非常快的。
然而,要记住的是,索引会降低插入和删除的性能。原因就是数据的写入也要同时也如索引。
但是索引对于那些读取多于写入的collection尤为有用。
对于写入数据频率高的collection,索引会影响性能。
大部分collection都是读取率高,所以索引对于大部分场景还是非常不错的。
不适用索引来进行排序如果排序的数据非常少(小于4M),那就不需要索引。一般要limit和sort一起使用。Geospatial地理空间 |