本章内容
- 默认索引_id
- 创建索引
- 索引类型
- 索引属性
- 索引用途
- 索引和排序规则
- 覆盖查询
- 索引交集
- 限制条件
- 其他注意事项
索引使得MongoDB的查询更加高效。没有索引,MongoDB必须执行集合扫描,即,要选择与查询语句匹配的文档,必须扫描集合中的每个文档。如果查询语句中使用了适当的索引,则MongoDB可以使用该索引来限制查询语句必须检查的文档数。
索引是一种特殊的数据结构[1],它以易于遍历的形式存储集合数据集中的一小部分。索引存储一个特定字段或一组字段的值,并按该字段的值排序。索引的排序支持高效的相等匹配和基于范围的查询操作。另外,MongoDB可以使用索引的排序返回有序的结果数据。
下图说明了使用索引选择并排序匹配了查询语句的文档:
![](https://i-blog.csdnimg.cn/blog_migrate/0ee38050e960342380efb629b1d174ab.png)
本质上,MongoDB中的索引与其他数据库系统中的索引类似。 MongoDB在集合级别定义索引,并支持MongoDB集合中文档的任何字段或子字段的索引。
[1] MongoDB索引使用B树数据结构。
一、默认索引_id
在创建集合期间,MongoDB在_id字段上创建唯一索引。_id索引可防止客户端为_id字段插入两个具有相同值的文档。您不能将在_id字段上删除索引。
注意
在分片群集中,如果您不使用_id字段作为分片键,则您的应用程序必须确保_id字段中值的唯一性以防止错误。_id字段的唯一性通常是通过使用标准的自动生成的ObjectId来完成的。
二、创建索引
- Mongo Shell
要在Mongo Shell中创建索引,请使用db.collection.createIndex()。
db.collection.createIndex( <key and index type specification>, <options> )
以下示例在name字段上创建单键降序索引:
db.collection.createIndex( { name: -1 } )
db.collection.createIndex方法仅在没有相同索引时来创建索引。
索引名称
索引的默认名称是索引键和索引中每个键的方向(即1或-1)的串联, 它们之间使用下划线作为分隔符。例如,在{ item : 1, quantity: -1 }上创建的索引的名称为item_1_quantity_-1。
可以使用自定义名称创建索引,例如比默认名称更易于阅读的名称。例如,考虑一个经常查询products集合以填充现有库存数据的应用程序。下面的createIndex()方法在item 和 quantity上创建索引,索引名字是 query
for
inventory:
db.products.createIndex(
{ item: 1, quantity: -1 } ,
{ name: "query for inventory" }
)
可以使用db.collection.getIndexes()方法查看索引名称。一旦创建索引,您将无法重命名。相反,必须删除并使用新名称重新创建索引。
三、索引类型
MongoDB提供了许多不同的索引类型来支持特定的数据类型和查询。
1.单字段索引
除了MongoDB定义的_id索引外,MongoDB还支持在文档的单个字段上创建用户自定义的升序或降序索引。
![](https://i-blog.csdnimg.cn/blog_migrate/cab95ba83e17d0335a48ea24ebc67ab6.png)
对于单字段索引和排序操作,索引键的排序顺序(即升序或降序)无关紧要,因为MongoDB可以沿任一方向遍历索引。
有关单字段索引的更多信息,请参见单字段索引和根据单字段索引排序。
2.复合索引
MongoDB还支持在多个字段上用户自定义的索引,即复合索引。
复合索引中的字段顺序具有重要意义。例如,如果一个复合索引由
{ userid: 1, score: -1 }组成,则该索引首先按userid排序,然后在每个userid值内按score排序。
![](https://i-blog.csdnimg.cn/blog_migrate/faf02c22fb3bac7b865d19760a79a7ba.png)
对于复合索引和排序操作,索引键的排序顺序(即升序或降序)可以确定索引是否可以支持排序操作。有关索引顺序对复合索引结果的影响的更多信息,请参见排序顺序。
3.多键索引
MongoDB使用多键索引在数组中的内容上创建索引。如果对数组类型的字段建立索引,则MongoDB将为数组的每个元素创建单独的索引条目。多键索引允许查询语句通过匹配数组的一个或多个元素来选择包含数组的文档。如果索引字段包含数组值,MongoDB会自动确定是否创建多键索引。而无需显式指定多键类型。
![](https://i-blog.csdnimg.cn/blog_migrate/2891003345566c35fcc7ced19198922b.png)
4.地理索引
为了支持对地理空间坐标数据的高效查询,MongoDB提供了两个特殊的索引:返回结果时使用平面几何的2d索引和使用球面几何返回结果的2dsphere索引。
有关地理空间索引的高级介绍,请参见2d Index Internals。
5.文本索引
MongoDB提供了一种文本索引类型,该类型支持在集合中搜索字符串内容。这些文本索引不存储特定于语言的停用词(例如“the”, “a”, “or”),并且将集合中的词干仅存储词根。
有关文本索引和搜索的更多信息,请参见文本索引。
6.哈希索引
为了支持基于哈希的分片,MongoDB提供了哈希索引类型,该索引类型对字段值的哈希创建索引。这些索引在其范围内具有更随机的值分布,但仅支持相等(equality)匹配,而不能支持基于范围的查询。
下篇:索引概述(二)