OPTIONS
翻译或纠错本页面

索引介绍

索引可以让 MongoDB中的查询执行更加高效。如果没有索引,MongoDB必须扫描集合中每一篇文档来选择符合查询条件的文档。这种 集合扫描 是低效的因为相比于对每步操作使用索引而言,全集扫描使得 mongod 要处理更多的数据量。

索引是一种特殊的数据结构 [1] ,它以一种易于遍历的格式保存了集合中数据集的小部分.一个索引会保存被索引的键或多个键的值,并按照值进行排序。

根本上来说,MongoDB中的索引和其它数据库系统中的索引是相似的。MongoDB在 集合 级别建立索引, 并支持对集合中文档的任意键或内嵌文档的键建立索引.

如果存在某个索引适用于当前查询,MongoDB可以使用该索引来减少查询过程中扫描的文档数。在某些情况下,MongoDB由索引中存储的数据就可以直接决定一篇文档是否和查询匹配。下图演示了一个查询使用索引来查找文档。

Diagram of a query selecting documents using an index. MongoDB narrows the query by scanning the range of documents with values of ``score`` less than ``30``.

Diagram of a query selecting documents using an index. MongoDB narrows the query by scanning the range of documents with values of score less than 30.

[1]

MongoDB中的索引使用B-tree数据结构来存储。

优化

点击阅读 查询优化 了解更多关于查询和索引间的关系。

创建索引来支持普通且面向用户的查询。这些索引将会确保MongoDB尽可能扫描最少量的文档。

索引同时也能在特殊场合下提升其他操作的性能:

结果排序

有了索引,MongoDB可以从索引中直接返回已经按照被索引键排序的文档,而不需要附加额外的一个排序阶段。

Diagram of a query that uses an index to select and return sorted results. The index stores ``score`` values in ascending order. MongoDB can traverse the index in either ascending or descending order to return sorted results.

Diagram of a query that uses an index to select and return sorted results. The index stores score values in ascending order. MongoDB can traverse the index in either ascending or descending order to return sorted results.

覆盖结果

当一个查询的条件和 映射 只包含被索引键, MongoDB 将会直接从索引返回结果 不需要 扫描任何文档或者将文档载入内存。这些被覆盖的查询是 非常的 高效的。

Diagram of a query that uses only the index to match the query criteria and return the results. MongoDB does not need to inspect data outside of the index to fulfill the query.

Diagram of a query that uses only the index to match the query criteria and return the results. MongoDB does not need to inspect data outside of the index to fulfill the query.

索引类型。

MongoDB提供了一些不同类型的索引来支持特定类型的数据和查询。

默认 _id

MongoDB中所有的集合都会对默认存在的 _id 建立索引。如果应用在存储的时候没有指定 _id 值,那么数据库驱动或者 mongod 将会自动创建一个 ObjectId 值作为 _id

The _id index is unique, and prevents clients from inserting two documents with the same value for the _id field.

单键索引

除了MongoDB预订义的 _id 索引外,MongoDB还支持用户对单键建立自定义索引,详见 文档的单键索引 。以下是单键索引的示例:

Diagram of an index on the ``score`` field (ascending).

Diagram of an index on the score field (ascending).

复合索引

MongoDB 支持用户对多个键建立自定义索引。这些 复合索引 就像单键索引一样;不同的是 ,查询可以基于多个键来选择文档。在符合索引中的键的顺序很重要。比如说,如果一个复合索引是这样: { userid: 1, score: -1 } ,那么索引首先会基于 userid 的值对文档排序,然后对于相同 userid 的文档,再按照 score 排序。以下是复合索引的示例:

Diagram of a compound index on the ``userid`` field (ascending) and the ``score`` field (descending). The index sorts first by the ``userid`` field and then by the ``score`` field.

Diagram of a compound index on the userid field (ascending) and the score field (descending). The index sorts first by the userid field and then by the score field.

多键索引

MongoDB使用 多键索引 来索引数组中的内容。如果您基于一个指向数组的键创建索引,那么MongoDB将会对数组中 每个 元素分别建立一条索引项。 多键索引 可以让查询通过匹配数组中元素内容的方式来选择文档。如果一个被索引键的值是一个数组,MongoDB可以自动的创建多键索引,不需要显式的指定。

以下是多键索引的示例:

Diagram of a multikey index on the ``addr.zip`` field. The ``addr`` field contains an array of address documents. The address documents contain the ``zip`` field.

Diagram of a multikey index on the addr.zip field. The addr field contains an array of address documents. The address documents contain the zip field.

地理空间索引

为了高效地查询地理坐标数据,MongoDB提供了两种特殊的索引: 二维索引 (使用平面几何返回结果) 和 二维球面索引 (使用球面几何返回结果)。

点击阅读 2d 索引原理 更深入了解地理空间索引。

文本索引

MongoDB提供了 文本 索引类型支持在集合中的文本搜索。这些文本索引不会存储相关语言中的 停止词 (比如 “the”, “a”, “or”),并对集合中的词作 剥离词干 处理,这样就可以只存储词根。

阅读 文本索引 了解更多关于文本索引与文本搜索。

哈希索引

为了支持 哈希分片 , MongoDB提供 哈希索引 ,对被索引键的值的哈希值进行索引。 在值域范围里,哈希索引有更随机的值分布,但是 支持等值匹配并且不支持基于范围的查询。

索引属性

唯一索引

索引的 唯一 属性可以让MongoDB避免被索引键的重复值。如果想基于已经有重复值的键创建 唯一索引 ,阅读 删除重复 了解更多创建选项细节。除了唯一性的限制以外,唯一索引和其他普通索引功能上一致。

稀疏索引

索引的 稀疏 属性可以确保该索引只索引那些包含了被索引键的文档。索引会跳过那些 没有 被索引键的文档。

索引的唯一性和稀疏性可以结合在一起,来确保文档中被索引键不会包含重复值而且忽略那些不包含被索引键的文档。

索引交集

2.6 新版功能.

MongoDB可以使用 索引交集 来匹配查询。 对于那些复合条件查询,如果有一个索引可以匹配其中一部分条件,另一个索引可以匹配其它部分条件, MongoDB 会使用两索引的交集来匹配整个查询。使用复合索引还是使用索引交集,哪个更高效取决与特定的查询和数据系统。

关于索引交集的细节,点击 索引交集

←   Indexes 索引概念  →