0

mongod.log には次のように表示されます。

 {deliver_area: { $geoIntersects:
     { $geometry: { 
         type: "Point", 
         coordinates: [ 116.3426399230957, 39.95959281921387 ] 
     } } 
 } }

 ntoreturn:0 
 ntoskip:0
 nscanned:2965
 keyUpdates:0
 numYields: 2 locks(micros)
 r:136723
 nreturned:52
 reslen:23453
 103ms

コレクションには約 10,000 レコードがあり、deliver_areaは Polygon(GeoJSON) であり、2dsphereインデックスを持つフィールドの 1 つです。

これは私のクエリです:

db.area_coll.find( { 
    id: 59, 
    deliver_area: { 
        $geoIntersects: { 
            $geometry: { 
                type: "Point", 
                coordinates: [ 116.3175773620605, 39.97607231140137 ] 
            } 
        } 
    } 
})

結果の説明:

{
    "cursor" : "S2Cursor",
    "isMultiKey" : true,
    "n" : 0,
    "nscannedObjects" : 0,
    "nscanned" : 3887,
    "nscannedObjectsAllPlans" : 0,
    "nscannedAllPlans" : 3887,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 5,
    "indexBounds" : {
    },
    "nscanned" : 3887,
    "matchTested" : NumberLong(666),
    "geoTested" : NumberLong(0),
    "cellsInCover" : NumberLong(1),
    "server" : "testing:27017"
}
4

1 に答える 1

1

ログ内のクエリは、実行したクエリと一致しません。場所が異なります。

[ 116.3426399230957, 39.95959281921387 ]対。
[ 116.3175773620605, 39.97607231140137 ]

また、ログ行全体を再現したとは思わareaないdeliver_area.

ただし、それほど遅くはありません。最初のケースでは、103 ミリ秒かかりました。これは、サーバーが他の IO を実行している場合に発生する可能性があります。explain()出力が示すように、2 番目のクエリには 5 ミリ秒かかりました。

しかし、最も印象的なのは、あなたの主な基準がid: 59. _idあなたのフィールドが何であるかはわかりませんが、インデックスを設定した場合、インデックスidを使用する必要さえまったくないはずです。その場合は、複合キー on を使用したほうがよいでしょう。2dsphereid=59{ id: 1, deliver_area: '2dsphere' }

于 2013-08-05T09:57:11.450 に答える