MongoDB,如何为包含地理空间查询、范围查询的查询创建索引,并对不同列进行排序



因此,如果我有一个查询执行以下操作(在伪代码中)

查找(附近的x,b>y)。排序(c)

其中a是地质柱,b是长的类型,c也是长的类型

关于(a:2d,b:1,c:1)的复合指数有效吗?

地理空间查询有自己的索引类别(正如您所提到的),地理哈希大大提高了第一个关键字查找的索引性能——如果您能正确设置,它比范围要好。无论如何,我认为你的策略会奏效:关键是将$maxDistance设置为一个相当小的值。

我插入了1000万个随机地理记录来匹配你的描述,就像这样:

{ "_id" : ObjectId("4f28e1cffc90631d239f8b5a"), "a" : [ 46, 47 ], "b" : ISODate("2012-02-01T06:53:25.543Z"), "c" : 19 }
{ "_id" : ObjectId("4f28e1bdfc90631d239c4272"), "a" : [ 54, 48 ], "b" : ISODate("2012-02-01T06:53:32.699Z"), "c" : 20 }
{ "_id" : ObjectId("4f28e206fc90631d23aac59d"), "a" : [ 46, 52 ], "b" : ISODate("2012-02-01T06:55:14.103Z"), "c" : 22 }
{ "_id" : ObjectId("4f28e1a7fc90631d23995700"), "a" : [ 54, 52 ], "b" : ISODate("2012-02-01T06:52:33.312Z"), "c" : 27 }
{ "_id" : ObjectId("4f28e1d7fc90631d23a0e9e7"), "a" : [ 52, 46 ], "b" : ISODate("2012-02-01T06:53:11.315Z"), "c" : 31 }

在maxDistance低于10的情况下,性能确实相当不错。

db.test13.find({a:{$near:[50,50], $maxDistance:4}, b:{$gt:d}}).sort({c:1}).explain();
{
"cursor" : "GeoSearchCursor",
"nscanned" : 100,
"nscannedObjects" : 100,
"n" : 100,
"scanAndOrder" : true,
"millis" : 25,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
}
}

如果你忽略maxDistance,它会开始受到很大的影响。有些查询运行时间长达60秒。次要范围参数似乎没有多大帮助,即使范围相当窄——它似乎都是关于maxDistance的。

我建议您使用它来了解地理空间索引的性能。这是我的测试插入循环。你也可以尝试限制比特,以获得更低分辨率的

function getRandomTime() {
   return new Date(new Date() - Math.floor(Math.random()*1000000));
}
function getRandomGeo() {
   return [Math.floor(Math.random()*360-180),Math.floor(Math.random()*360-180)];
}
function initialInsert() {
   for(var i = 0; i < 10000000; i++) {
      db.test13.save({
         a:getRandomGeo(),
         b:getRandomTime(),
         c:Math.floor(Math.random()*1000)
      });
   }
}

相关内容

  • 没有找到相关文章

最新更新