当索引包含该查询扫描的所有字段时,该索引就支持该查询。该查询将扫描索引而不是集合。创建支持查询的索引可以大大提高查询性能。
本文档介绍了用于创建支持查询的索引的策略。
如果只查询给定集合中的单个键,则只需要为该集合创建一个单键索引。例如,您可以category
在product
集合中创建一个索引:
如果有时只查询一个键,而有时又查询该键和第二个键的组合,则创建复合索引比创建单键索引更有效。MongoDB将对两个查询使用复合索引。例如,您可以在category
和两者上创建索引item
。
这允许您两个选择。您可以只查询category
,也可以与category
组合查询item
。多个字段上的单个复合索引可以支持所有搜索这些字段的“前缀”子集的查询。
例
集合上的以下索引:
可以支持以下索引支持的查询:
在某些情况下,前缀索引可能会提供更好的查询性能:例如,如果z
数组很大。
该索引还可以支持许多与以下索引相同的查询:{ x: 1, y: 1, z: 1 }
另外,还有其他用途。给定以下查询:{ x: 1, z: 1 }
该指数同时支持查询和排序操作,而指数只支持查询。有关排序的更多信息,请参见
使用索引对查询结果进行排序。{ x: 1, z: 1 }
{ x: 1, y: 1, z: 1 }
从2.6版开始,MongoDB可以使用索引交集来完成查询。创建支持查询的复合索引还是依赖索引交集之间的选择取决于系统的具体情况。有关更多详细信息,请参见 索引交集和复合索引。
要将索引用于字符串比较,操作还必须指定相同的排序规则。即,具有排序规则的索引不能支持对索引字段进行字符串比较的操作(如果该操作指定了不同的排序规则)。
例如,该集合myColl
在category
具有排序规则语言环境的字符串字段上具有索引"fr"
。
以下查询操作指定与索引相同的排序规则,可以使用索引:
但是,默认情况下使用“简单”二进制整理程序的以下查询操作不能使用索引:
对于索引前缀键不是字符串,数组和嵌入式文档的复合索引,指定其他排序规则的操作仍可以使用索引来支持索引前缀键的比较。
例如,集合myColl
在数字字段score
和price
字符串字段
上具有复合索引category
;使用排序规则语言环境创建索引以
"fr"
进行字符串比较:
使用"simple"
二进制排序规则进行字符串比较的以下操作可以使用索引:
下面的操作使用"simple"
二进制排序规则对索引category
字段进行字符串比较,该操作可以使用索引仅满足查询的一部分:score: 5