3

以下のクエリは現在、3つの異なる配列から緯度、経度、およびIDの入力を受け取るループ(PHPの場合)内にあります。配列内の位置/キーごとに、以下のクエリを使用してテーブルから最も近い地理的場所が選択されます。

配列のサイズは通常約500であるため、最も近い地理的位置を見つける必要がある500セットの入力には時間がかかります。

私の質問:phpからの入力配列を一度に使用して1つのクエリを使用し、各配列キーのすべての最も近い地理的位置のセットを選択する方法はありますか?

$sql="SELECT 
id, d, tolon, tolat, du,
       ( 3959 * acos( cos( radians($lat1) ) 
              * cos( radians( travel.tolat ) ) 
              * cos( radians( travel.tolon) - radians($lon1) ) 
              + sin( radians($lat1) ) 
              * sin( radians( travel.tolat ) ) ) ) AS distance 
FROM travel 
WHERE userid = $id AND tolon > $lonlow AND tolon < $lonhigh AND tolat > $latlow AND tolat < $lathigh
having distance < $maxdistance ORDER BY distance
";
4

1 に答える 1

1

limit 1最も近いものだけが必要な場合は、を追加することをお勧めしますが、多数の組合よりもはるかにうまくいくとは思いません。ユニオンの束は非常に長いSQL文字列になり、ヒットする可能性のある制限があります(max packet sizeこれが設定だと思います)。一度に100程度のユニオンをチャンクする必要があります。

テーブルにこのタイプのクエリ用に設計されたインデックスが含まれている場合、多くの利益を得ることができます。mysqlはspatial indexes、通常のインデックスはこのユースケースではあまりうまく機能しないため、真剣に検討する必要があることをサポートしています。

于 2012-05-07T03:30:43.970 に答える