创建索引以支持您的查询

在本页面

当索引包含该查询扫描的所有字段时,该索引就支持该查询。该查询将扫描索引而不是集合。创建支持查询的索引可以大大提高查询性能。

本文档介绍了用于创建支持查询的索引的策略。

如果所有查询都使用相同的单键,则创建单键索引

如果只查询给定集合中的单个键,则只需为该集合创建一个单键索引。例如,您可以在product集合中的category上创建索引:

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

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

如果有时只查询一个键,而有时又查询该键和第二个键的组合,那么创建复合索引比创建单键索引更有效。 MongoDB 将对两个查询使用复合索引。例如,您可以同时在categoryitem上创建索引。

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

这允许您两个选择。您可以只查询category,也可以查询categoryitem组合。多个字段上的单个compound index可以支持所有搜索这些字段的“前缀”子集的查询。

Example

集合上的以下索引:

{ 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 }索引仅支持查询。有关排序的更多信息,请参见使用索引对查询结果进行排序

从 2.6 版开始,MongoDB 可以使用index intersection来执行查询。创建支持查询的复合索引还是依赖索引交集之间的选择取决于系统的具体情况。有关更多详细信息,请参见索引交集和复合索引

索引使用和整理

要将索引用于字符串比较,操作还必须指定相同的排序规则。也就是说,如果排序规则的索引指定了不同的排序规则,则该索引不能支持对索引字段执行字符串比较的操作。

例如,集合myColl在具有排序规则语言环境"fr"的字符串字段category上具有索引。

db.myColl.createIndex( { category: 1 }, { collation: { locale: "fr" } } )

以下查询操作指定与索引相同的排序规则,可以使用索引:

db.myColl.find( { category: "cafe" } ).collation( { locale: "fr" } )

但是,默认情况下使用“简单”二进制整理程序的以下查询操作不能使用索引:

db.myColl.find( { category: "cafe" } )

对于索引前缀键不是字符串,数组和嵌入式文档的复合索引,指定其他排序规则的操作仍可以使用索引来支持索引前缀键的比较。

例如,集合myColl在数字字段scoreprice和字符串字段category上具有复合索引;使用排序规则语言环境"fr"创建索引以进行字符串比较:

db.myColl.createIndex(
   { score: 1, price: 1, category: 1 },
   { collation: { locale: "fr" } } )

以下使用"simple"二进制排序规则进行字符串比较的操作可以使用索引:

db.myColl.find( { score: 5 } ).sort( { price: 1 } )
db.myColl.find( { score: 5, price: { $gt: NumberDecimal( "10" ) } } ).sort( { price: 1 } )

以下操作将"simple"二进制排序规则用于在已索引的category字段上进行字符串比较,可以使用该索引来仅满足查询的score: 5部分:

db.myColl.find( { score: 5, category: "cafe" } )