1

mongodb "2d" インデックスを使用して古いコレクションを、geojson 仕様の "2dsphere" インデックスを持つコレクションに変換しました。問題は、約 2 つの lac オブジェクトのコレクションでクエリを実行するのに約 11 秒かかることです。以前は、クエリに約 100 ミリ秒かかっていました。私の文書は次のとおりです。

{ "_id": ObjectId("4f9c2aa2d142b9882f02a3b3"), "geonameId": NumberInt(1106542), "name": "Chitungwiza", "feature code": "PPL", "country code": "ZW", "state": "Harare Province", "population": NumberInt(340360), "elevation": "", "timezone": "Africa\/Harare", "geolocation": { "type": "Point", "coordinates": { "0": 31.07555, "1": -18.01274 } } }

私の説明クエリの出力を以下に示します。

db.city_info.find({"geolocation":{'$near':{ '$geometry': { 'type':"Point",coordinates:[73,23] } }}}).explain()

{
"cursor" : "S2NearCursor",
"isMultiKey" : true,
"n" : 172980,
"nscannedObjects" : 172980,
"nscanned" : 1121804,
"nscannedObjectsAllPlans" : 172980,
"nscannedAllPlans" : 1121804,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 13,
"nChunkSkips" : 0,
"millis" : 13841,
"indexBounds" : {

},
"nscanned" : 1121804,
"matchTested" : NumberLong(191431),
"geoMatchTested" : NumberLong(191431),
"numShells" : NumberLong(373),
"keyGeoSkip" : NumberLong(930373),
"returnSkip" : NumberLong(933610),
"btreeDups" : NumberLong(0),
"inAnnulusTested" : NumberLong(191431),
"server" : "..."
}

問題を修正してクエリ時間を短縮する方法を教えてください。

4

2 に答える 2

2

$near コマンドは、「2dsphere」データベースに対して $maxDistance 引数を必要としません。$maxDistance を追加すると、クエリ結果の数を管理可能な数に減らす範囲が指定されました。「2d」スタイルのインデックスから「2dsphere」スタイルのインデックスに変更した経験の違いの理由は、何も指定されていない場合、「2d」インデックスではデフォルトの制限が 100 に設定されるためです。ご覧のとおり、2dsphere インデックスのデフォルトのクエリ プランではこのような制限が課されていないため、クエリはインデックス全体をスキャンしています ("nscannedObjects" : 172980)。「2d」インデックスで同じクエリを実行すると、「n」と「nscannedObjects」がわずか 100 であることがわかり、コストの不一致が説明されます。

すべての項目が $maxDistance の範囲内にある場合 (たとえば、$maxDistance 20M メートルで試してください)、クエリのパフォーマンスが低下し、それがない場合に戻ることがわかります。どちらの場合でも、 limit() を使用してクエリ プランにインデックス内の必要な結果のみをスキャンし、暴走を防ぐように指示することが非常に重要です。これは、特に大きなデータ セットの場合に顕著です。

于 2013-07-08T17:01:24.123 に答える
0

私は問題を解決しました。$near コマンドには、 http ://docs.mongodb.org/manual/applications/2dsphere/ で指定されている $maxDistance 引数が必要です。$maxDistance を指定するとすぐに、クエリ時間が 100 ミリ秒未満に短縮されました。

于 2013-03-28T06:37:16.423 に答える