复合索引
复合索引从集合中每个文档的两个或多个字段收集数据并对其排序。数据先按索引中的第一个字段分组,再按每个后续字段分组。
例如,下图显示了一个复合索引,其中文档会先按 userid
进行分组并以升序(按字母顺序)排序。然后,每个 userid
的 scores
会按降序排序:
对经常查询的字段进行索引可提高实现覆盖查询 的可能性。覆盖查询是指可使用某一索引而不必检查任何文档便可完全满足的查询,从而可大幅提升性能。
要创建复合索引,请使用以下原型:
db.<collection>.createIndex( { <field1>: <sortOrder>, <field2>: <sortOrder>, ... <fieldN>: <sortOrder> } )
您可以在用户界面中为 MongoDB Atlas 托管的部署创建和管理复合索引。
用例
如果应用程序重复运行包含多个字段的查询,则可以创建复合索引来提高查询性能。例如,杂货店经理经常需要按名称和数量查找库存商品,以确定哪些商品库存不足。您可以在 item
和 quantity
字段上创建复合索引以提高查询性能。
对经常查询的字段使用复合索引可以增加覆盖这些查询的机会。覆盖的查询是可以完全使用索引来满足的查询,而无需检查任何文档。这样可以优化查询性能。
开始体验
如要创建复合索引,请参阅创建复合索引。
详情
本部分将介绍复合索引的技术细节和限制。
字段限制
单个复合索引最多可包含 32 个字段。
字段排序
索引字段的顺序会影响复合索引的有效性。复合索引根据索引中字段的顺序包含对文档的引用。如要创建高效的复合索引,请遵守 ESR(相等、排序、范围)规则。
排序顺序
索引会按升序 (1
) 或降序 (-1
) 存储对字段的引用。对于复合索引,排序顺序可决定索引是否支持排序操作。有关更多信息,请参阅复合索引排序顺序。
哈希索引字段
复合索引可以包含单个哈希索引字段。
索引前缀
索引前缀是索引字段的起始子集。复合索引支持对索引前缀中包含的所有字段进行查询。
例如,考虑以下复合索引:
{ "item": 1, "location": 1, "stock": 1 }
此索引具有以下索引前缀:
{ item: 1 }
{ item: 1, location: 1 }
MongoDB 可以使用复合索引来支持对这些字段组合的查询:
item
item
和location
item
、location
和stock
stock
MongoDB 还可以使用索引来支持对 item
和 stock
字段的查询,因为 item
字段对应于前缀。但是,只有索引中的 item
字段可以支持此查询。查询不能使用 location
后面的 stock
字段。
索引字段按顺序解析;如果查询省略了索引前缀,它将无法使用该前缀后面的任何索引字段。
MongoDB 无法使用复合索引来支持对这些字段组合的查询:
location
stock
location
和stock
如果没有 item
字段,则前面的字段组合都不对应于前缀索引。
稀疏复合索引
复合索引可以包含不同类型的稀疏索引。索引类型的组合决定了复合索引与文档的匹配方式。
本表汇总了包含不同类型稀疏索引的复合索引的行为:
复合索引组件 | 复合索引行为 |
---|---|
Ascending indexes Descending indexes | 仅对至少包含一个键值的文档进行索引。 |
仅当文档包含一个 geospatial 字段的值时,才为文档编制索引。不在升序或降序索引中索引文档。 | |
仅当文档与一个 text 字段匹配时,才为文档编制索引。不在升序或降序索引中索引文档。 |
了解详情
要了解如何创建高效的复合索引,请参阅 ESR(相等、排序、范围)规则。