创建复合索引
复合索引是包含对多个字段的引用的索引。 复合索引可提高对索引中的字段或索引前缀中的字段进行查询的性能。 对经常查询的字段建立索引可以增加覆盖这些查询的机会,这意味着MongoDB可以完全使用索引来满足查询,而无需检查文档。
要创建复合索引,请使用 db.collection.createIndex()
方法:
db.<collection>.createIndex( { <field1>: <sortOrder>, <field2>: <sortOrder>, ... <fieldN>: <sortOrder> } )
限制
在单个复合索引中最多可以指定 32 个字段。
开始之前
创建一个 students
集合,其中包含以下文档:
db.students.insertMany([ { "name": "Alice", "gpa": 3.6, "location": { city: "Sacramento", state: "California" } }, { "name": "Bob", "gpa": 3.2, "location": { city: "Albany", state: "New York" } } ])
步骤
以下操作将创建一个包含 name
和 gpa
字段的复合索引:
db.students.createIndex( { name: 1, gpa: -1 } )
在本例中:
name
上的索引是升序 (1
)。gpa
上的索引为降序 (-1
)。
结果
创建的索引支持选择以下项的查询:
name
和gpa
字段。仅
name
字段,因为name
是复合索引的前缀。
例如,索引支持这些查询:
db.students.find( { name: "Alice", gpa: 3.6 } ) db.students.find( { name: "Bob" } )
索引不支持仅对 gpa
字段进行查询,因为 gpa
不是索引前缀的一部分。例如,索引不支持以下查询:
db.students.find( { gpa: { $gt: 3.5 } } )
了解详情
要了解如何创建高效的复合索引,请参阅 ESR(相等、排序、范围)规则。
要了解排序顺序(升序或降序)如何影响复合索引的性能,请参阅使用索引对查询结果进行排序。
要了解其他索引类型,请参阅索引类型。
如要了解可以为索引指定哪些属性,请参阅索引属性。