Mongodb query - 复合索引的使用顺序是否重要

Mongodb query - Does sequence of key matters in usage of compound index

假设我创建了如下索引:-

db.collection.createIndex( { propA: 1, propB: 1, propC:1 } )

我查询如下:-

db.collection.find({propB:'x', propC: 'y', propA:'z'})

mongo 查询引擎是否会使用上面创建的索引。 编写查询时使用复合索引的关键顺序是否重要?

查询中 键的顺序 无关紧要:MongoDB 足够聪明,可以查看所有查询的属性并找到合适的索引。

但是,在索引中定义的键的顺序很重要:复合索引可用于match queries against any prefix of its keys,按照它们在索引中定义的顺序文档。所以你上面的索引可以用来回答像 {propA: 'x', propB: 'y'} 这样的查询,但不能回答像 {propB: 'y', propC: 'z'} 这样的查询。

您可以使用 explain() 来确定哪个索引 MongoDB 将用于特定查询。

补充一下 Avish 的回答,这种由多个字段组成的索引称为复合索引。复合索引中列出的字段的顺序非常重要。原因如下:

索引将包含对文档的引用,这些文档首先按第一个字段的值排序,在第一个字段的每个值中,按第二个字段的值排序,在第二个字段的每个值中,按第三个字段的值,依此类推。

例如,在您的情况下,索引将包含对文档的引用,这些文档首先按 propA 字段的值排序,然后在 propA 字段的每个值中,按 propB 字段的值排序,然后在propB 字段,按 propC 字段的值排序。

因此请记住,以下查询将使用给定的索引:

  • db.collection.find({propA:'z'})
  • db.collection.find({propB:'x', propC: 'y', propA:'z'})
  • db.collection.find({propB:'x', propA:'z'})

以下不能使用给定的索引:

  • db.collection.find({propB:'x'})
  • db.collection.find({propC:'y'})
  • db.collection.find({propB:'x', propC: 'y'})