【发布时间】: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