【问题标题】:Mongodb query - Does sequence of key matters in usage of compound indexMongodb查询 - 关键序列在复合索引的使用中是否重要
【发布时间】:2016-08-26 22:51:57
【问题描述】:

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

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

我查询如下:-

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

mongo 查询引擎是否会使用上面创建的索引。 编写查询时,键的顺序对复合索引的使用有影响吗?

【问题讨论】:

    标签: mongodb mongodb-query mongodb-indexes


    【解决方案1】:

    为了补充 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'})

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 所以为了 100% 清晰,db.collection.find({propB: 'y', propA: 'x'}) 也将使用索引。了解这一点对我来说很关键。
      • 是的,这是正确的:因为propA + propB 形成了索引属性的前缀 (propA, propB, propC),那么只使用查询中的那些 - 以任何顺序 - 仍将使用索引。
      • @SindhooOad propA, propC 不是索引属性的前缀;但propA 是。所以同时查询propApropC会使MongoDB使用propA查询索引,然后根据propC过滤结果而不使用索引。但是为什么不试试explain() 自己看看呢?
      • @avish 我有一个索引{ "v" : 2, "key" : {"is_pending" : 1, "r_id" : 1, "type" : 1 }, "name" : "is_pending_1_r_id_1_type_1"} 当我运行这个查询时.find({"is_pending":true,"type" : "signup"}).explain() 在winingPlan "indexName" : "is_pending_1_r_id_1_type_1", 中得到了这个。因此,它在两个键上的上述查询中运行该索引。
      • @SindhooOad 我的理解是它只会使用is_pending 键的索引而不是type,因为r_id 不包含在查询中并出现在索引中在type 之前。您应该能够在解释结果的keyPattern 部分中查看索引扫描期间正在使用哪些键。请参阅此处了解更多信息:docs.mongodb.com/manual/tutorial/analyze-query-plan
      猜你喜欢
      • 1970-01-01
      • 2019-02-15
      • 2013-11-11
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 2013-12-15
      • 2020-04-09
      相关资源
      最近更新 更多