Docs 菜单
Docs 主页
/
MongoDB Manual
/ /

复合索引

在此页面上

  • 用例
  • 开始体验
  • 详情
  • 字段限制
  • 字段排序
  • 排序顺序
  • 哈希索引字段
  • 索引前缀
  • 稀疏复合索引
  • 了解详情

复合索引从集合中每个文档的两个或多个字段收集数据并对其排序。数据先按索引中的第一个字段分组,再按每个后续字段分组。

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

``userid`` 字段(升序)和 ``score`` 字段(降序)的复合索引图。索引首先按 ``userid`` 字段排序,然后按 ``score`` 字段排序。

对经常查询的字段进行索引可提高实现覆盖查询的可能性。覆盖查询是指可使用某一索引而不必检查任何文档便可完全满足的查询,从而可大幅提升性能。

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

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

您可以在用户界面中为 MongoDB Atlas 托管的部署 创建和管理复合索引 。

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

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

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

本部分将介绍复合索引的技术细节和限制。

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

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

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

复合索引可以包含单个哈希索引字段。

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

例如,考虑以下复合索引:

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

此索引具有以下索引前缀:

  • { item: 1 }

  • { item: 1, location: 1 }

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

  • item

  • itemlocation

  • itemlocationstockstock

MongoDB 还可以使用索引来支持对 itemstock 字段的查询,因为 item 字段对应于前缀。但是,只有索引中的 item 字段可以支持此查询。查询不能使用 location 后面的 stock 字段。

索引字段按顺序解析;如果查询省略了索引前缀,它将无法使用该前缀后面的任何索引字段。

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

  • location

  • stock

  • locationstock

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

提示

删除冗余索引

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

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

本表汇总了包含不同类型稀疏索引的复合索引的行为:

复合索引组件
复合索引行为
升序索引
降序索引
仅对至少包含一个键值的文档进行索引。
升序索引
降序索引
仅当文档包含一个 geospatial 字段的值时,才为文档编制索引。不在升序或降序索引中索引文档。
升序索引
降序索引
仅当文档与一个 text 字段匹配时,才为文档编制索引。不在升序或降序索引中索引文档。

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

← 对嵌入式文档创建索引