复合索引
复合索引收集并排序集合中每个文档的来自两个或更多字段的数据。数据按索引中的第一个字段分组,然后按每个后续字段分组。
例如,以下图像显示了一个复合索引,其中文档首先按userid
升序(按字母顺序)分组。然后,每个 userid
的 scores
按降序排序
索引常用查询字段可以增加覆盖查询的可能性。覆盖查询是可以完全使用索引来满足的查询,不需要检查任何文档,从而大大提高性能。
要创建复合索引,请使用以下原型
db.<collection>.createIndex( { <field1>: <sortOrder>, <field2>: <sortOrder>, ... <fieldN>: <sortOrder> } )
您可以在UI中创建和管理复合索引,用于托管在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
MongoDB还可以使用索引来支持对item
和stock
字段的查询,因为item
字段对应一个前缀。但是,只有索引中的item
字段可以支持这种查询。查询不能使用紧随其后的stock
字段(即紧随location
字段之后的字段)。
索引字段是按顺序解析的;如果查询省略了索引前缀,则无法使用该前缀之后的所有索引字段。
MongoDB无法使用复合索引来支持这些字段组合的查询。
位置
库存
location
和stock
如果没有item
字段,前面的任何字段组合都不对应前缀索引。
稀疏复合索引
复合索引可以包含不同类型的稀疏索引。索引类型的组合决定了复合索引如何匹配文档。
下表总结了包含不同类型稀疏索引的复合索引的行为
了解更多
要了解如何创建高效的复合索引,请参阅ESR(相等性、排序、范围)规则。