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'})
假设我创建了如下索引:-
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'})