したがって、次のことを行うクエリがある場合(疑似コードで)
find(近くの x, b > y).sort(c)
ここで、a は geo 列、b は long 型、c も long 型です。
(a:2d, b:1, c:1) の複合インデックスは機能し、提案されますか?
したがって、次のことを行うクエリがある場合(疑似コードで)
find(近くの x, b > y).sort(c)
ここで、a は geo 列、b は long 型、c も long 型です。
(a:2d, b:1, c:1) の複合インデックスは機能し、提案されますか?
地理空間クエリには独自のインデックス カテゴリがあり (ご指摘のとおり)、ジオハッシュにより、最初のキー ルックアップのインデックス パフォーマンスが大幅に向上します。適切に設定できれば、範囲よりも優れています。いずれにせよ、あなたの戦略はうまくいくと思います。重要なのは $maxDistance をかなり小さい値に設定することです。
次のように、説明に一致するように 1,000 万のランダムな地理レコードを挿入しました。
{ "_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)
});
}
}