【问题标题】:indexing for distinct to use covered query索引不同以使用覆盖查询
【发布时间】:2017-11-15 07:56:40
【问题描述】:

我无法使用索引优化不同的查询。

我的收藏是这样的:

{
        "_id" : ObjectId("592ed92296232608d00358bd"),
        "measurement" : ObjectId("592ed92196232608d0034c23"),
        "loc" : {
                "coordinates" : [
                        2.65939299848366,
                        50.4380671935187
                ],
                "type" : "Point"
        },
        "elements" : [
                ObjectId("592ed92196232608d0034c24"),
                ObjectId("592ed92196232608d0034c26"),
                ObjectId("592ed92196232608d0034c28")
        ]
}

我正在尝试执行类似的查询

db.mycol.distinct('elements', {  
   $and:[  
      measurement:{  
         $in:[  
            ObjectId("592ed92196232608d0034c23"),
            ObjectId("592ed92196232608d0034c24")
         ]
      },
      {  
         loc:{  
            $geoWithin:{  
               $geometry:{  
                  type:'Polygon',
                  coordinates:[[  
                    [  
                       2.0214843750000004,
                       50.25071752130677
                    ],
                    [  
                       2.0214843750000004,
                       50.65294336725709
                    ],
                    [  
                       3.0487060546875004,
                       50.65294336725709
                    ],
                    [  
                       3.0487060546875004,
                       50.25071752130677
                    ],
                    [  
                       2.0214843750000004,
                       50.25071752130677
                    ]
                 ]]
               }
            }
         }
      }
   ]
})

我有这个索引:

{
  measurement: 1,
  loc: '2dsphere',
  elements: 1
}

查询计划 (db.mycol.explain().distinct(...)) 显示 IXSCAN,但查询需要很长时间。我添加了索引,希望它可以使用Mongo covered query。该文档指出

  • 查询中的所有字段都是索引的一部分,
  • 并且结果中返回的所有字段都在同一个索引中。

所以我猜我需要一个包含elements 的索引。但是根据查询的执行时间,它并没有使用它。

为此类查询索引集合的最佳方法是什么?

【问题讨论】:

  • 在一个集合上创建多个2dsphere 索引通常不是一个好主意。事实上,聚合$geoNear 和其他基于$near 的查询等操作根本不支持它。你应该选择你最常用的组合并坚持下去。
  • 会尝试让 1 个索引并回来告诉你结果
  • 已编辑。我只留下了包含“元素”的 2 个索引(不确定将它放在哪里,在末尾或开头,这没有记录)。这会导致这次 COLSCAN
  • 哈。多次运行查询将其转换为 IXSCAN,使用末尾带有元素的索引。但我怀疑这只是“查询”时间,而不是“选择”时间(涵盖的查询)。因为查询需要很长时间

标签: mongodb indexing distinct-values


【解决方案1】:

覆盖查询不适用于数组。

来自问题中提到的同一页面:

索引字段的限制

如果出现以下情况,则索引不能覆盖查询:

  • 集合中任何文档中的任何索引字段都包含一个数组。如果索引字段是数组,则索引变为多键索引,不支持覆盖查询。

【讨论】:

  • 完美。谢谢。
  • 此外,在尝试处理此类查询时,应该怎么做才能充分利用索引系统和 mongo 引擎?
  • 这有点复杂。您能否将db.mycol.explain("allPlansExecution").distinct('elements', {....}) 的结果添加到问题中(可能需要一些时间,并且输出会很长)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-18
  • 1970-01-01
  • 2017-01-12
  • 2017-06-22
  • 1970-01-01
  • 2010-10-11
相关资源
最近更新 更多