复合索引是包含对多个字段的引用的索引。复合索引可提高对索引中的字段或 索引前缀中的字段进行查询的性能。
要创建复合索引,请使用 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(相等、排序、范围)指南。
要了解排序顺序(升序或降序)如何影响复合索引的性能,请参阅使用索引对查询结果进行排序。
要了解其他索引类型,请参阅索引类型。
如要了解可以为索引指定哪些属性,请参阅索引属性。