翻译或纠错本页面

创建索引以支持查询

当索引包含了查询的所有键时,索引可以支持该查询。查询会扫描索引而不是集合。创建可以支持查询的索引会带来极大的查询性能提升。

本文描述了创建支持查询的索引的策略。

如果所有的查询都使用同样的单个键时,创建一个单键索引

如果您在某个集合上只查询某个单键,那么您可以在这个集合上创建一个单键索引。例如,您可能在 product 集合的 category 键上创建索引:

db.products.createIndex( { "category": 1 } )

创建复合索引以支持几个不同的查询

如果您有时需要查询某个键,而有时又需要查询同样的键和额外的键,那么和创建单键索引相比,创建复合索引会是更高效的选择。MongoDB都会使用复合索引来处理这两种请求。例如,您可能会在 categoryitem 键上创建索引:

db.products.createIndex( { "category": 1, "item": 1 } )

这允许您有两种选择。您可以只查询 category 或者同时查询 categoryitem 。一个在多个键上创建的 复合索引 可以支持那些搜索被索引键的 “前缀” 子集的查询。

例子

在某集合上有如下索引:

{ x: 1, y: 1, z: 1 }

它可以支持如下索引支持的查询:

{ x: 1 }
{ x: 1, y: 1 }

在某些情况下,前缀键的索引可能会有更好的查询性能:例如,如果 z 是一个很大的数组。

索引 { x: 1, y: 1, z: 1 } 也支持许多如下索引支持的查询:

{ x: 1, z: 1 }

此外, { x: 1, z: 1 } 索引还有其它用途。给定如下查询:

db.collection.find( { x: 5 } ).sort( { z: 1} )

索引 { x: 1, z: 1 } 同时支持查询和排序操作,但是索引 { x: 1, y: 1, z: 1 } 只支持查询。参见 使用索引来排序查询结果 了解更多关于排序的详细信息。

Starting in version 2.6, MongoDB can use index intersection to fulfill queries. The choice between creating compound indexes that support your queries or relying on index intersection depends on the specifics of your system. See 索引交集和复合索引 for more details.