文档菜单
文档首页
/
MongoDB 手册
/ /

复合索引

本页内容

  • 用例
  • 入门
  • 详细信息
  • 字段限制
  • 字段顺序
  • 排序顺序
  • 哈希索引字段
  • 索引前缀
  • 稀疏复合索引
  • 了解更多

复合索引收集并排序集合中每个文档的来自两个或更多字段的数据。数据按索引中的第一个字段分组,然后按每个后续字段分组。

例如,以下图像显示了一个复合索引,其中文档首先按userid 升序(按字母顺序)分组。然后,每个 useridscores 按降序排序

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.

索引常用查询字段可以增加覆盖查询的可能性。覆盖查询是可以完全使用索引来满足的查询,不需要检查任何文档,从而大大提高性能。

要创建复合索引,请使用以下原型

db.<collection>.createIndex( {
<field1>: <sortOrder>,
<field2>: <sortOrder>,
...
<fieldN>: <sortOrder>
} )

如果您的应用程序反复运行包含多个字段的查询,您可以通过创建复合索引来提高该查询的性能。例如,一家杂货店经理经常需要通过名称和数量查找库存项目,以确定哪些项目库存不足。您可以在itemquantity字段上创建复合索引,以提高查询性能。

在常用查询字段上的复合索引增加了那些查询被覆盖的机会。覆盖查询是可以完全使用索引来满足的查询,无需检查任何文档。这优化了查询性能。

要创建复合索引,请参阅创建复合索引。

本节描述了复合索引的技术细节和限制。

单个复合索引可以包含最多32个字段。

索引字段的顺序会影响复合索引的有效性。复合索引根据索引中字段的顺序引用文档。要创建高效的复合索引,请遵循ESR(相等、排序、范围)规则。

索引存储了对字段的引用,这些字段按升序(1)或降序(-1)排序。对于复合索引,排序顺序可以确定索引是否支持排序操作。有关更多信息,请参阅复合索引排序顺序。

复合索引可能包含一个哈希索引字段。

索引前缀是索引字段的起始子集。复合索引支持对索引前缀中包含的所有字段进行查询。

例如,考虑以下复合索引

{ "item": 1, "location": 1, "stock": 1 }

该索引具有以下索引前缀

  • { item: 1 }

  • { item: 1, location: 1 }

MongoDB可以使用复合索引来支持对这些字段组合的查询

  • item

  • itemlocation

  • itemlocationstock

MongoDB还可以使用索引来支持对itemstock字段的查询,因为item字段对应一个前缀。但是,只有索引中的item字段可以支持这种查询。查询不能使用紧随其后的stock字段(即紧随location字段之后的字段)。

索引字段是按顺序解析的;如果查询省略了索引前缀,则无法使用该前缀之后的所有索引字段。

MongoDB无法使用复合索引来支持这些字段组合的查询。

  • 位置

  • 库存

  • locationstock

如果没有item字段,前面的任何字段组合都不对应前缀索引。

提示

移除冗余索引

如果你有一个同时具有复合索引和其前缀索引(例如,{ a: 1, b: 1 }{ a: 1 })的集合,并且两个索引都没有稀疏唯一约束,你可以移除前缀索引({ a: 1 })。MongoDB会在所有原本会使用前缀索引的情况下使用复合索引。

复合索引可以包含不同类型的稀疏索引。索引类型的组合决定了复合索引如何匹配文档。

下表总结了包含不同类型稀疏索引的复合索引的行为

复合索引组件
复合索引行为
升序索引
降序索引
仅对包含至少一个键值的文档建立索引。
升序索引
降序索引
仅当文档包含一个地理空间字段值时才建立索引。不建立升序或降序索引。
升序索引
降序索引
仅当文档与一个文本字段匹配时才建立索引。不建立升序或降序索引。

要了解如何创建高效的复合索引,请参阅ESR(相等性、排序、范围)规则。

返回

嵌入文档