2

データベースには約 100,000 のマーチャントが保存されており、テーブルには名前、緯度、経度が含まれています

現在、私の検索機能は緯度/経度の入力を受け取り、半径 10 マイル以内の店舗を検索します。ただし、100,000 の加盟店の多くはフランチャイズ (関連店舗のグループ) です。フランチャイズについては、最寄りの店舗のみを表示し、同じフランチャイズの残りの店舗は非表示にします (半径 10 マイル以内に複数の場所がある場合)。

私はやってみました:

SELECT SQL_CALC_FOUND_ROWS *, xxxxx as Distance
FROM table
WHERE isActive = 1
GROUP BY Name
HAVING Distance < 10
ORDER BY Distance ASC

xxxxx は、入力された緯度/経度に基づいて距離を計算する関数です。

((ACOS(SIN('$lat'*PI()/180)*SIN(`Latitude`*PI()/180) + COS('$lat'*PI()/180)*COS(`Latitude`*PI()/180)*COS(('$long'-`Longitude`)*PI()/180))*180/PI())*60*1.1515)

ただし、正しい結果が返されません。「GROUP BY」句を使用しない同じクエリと比較すると、フランチャイズ店または非フランチャイズ店に関係なく、結果が大幅に少なくなります。何が問題なのかしら?

また、速度は非常に遅いです。Name 列にインデックスを付けました。しかし、MySQL は多くの文字列比較を行う必要があるため、「GROUP BY Name」がボトルネックだと思いますか? GROUP BY のバグを修正できると仮定すると、これを高速化するためのオプションは何か疑問に思っています。「Business_Group」列を設定して店舗を前処理して、フランチャイズ店舗にBusiness_Group IDが割り当てられるようにする価値はありますか?

4

2 に答える 2

0

派生テーブルをグループ化してみる

SELECT * FROM (
    SELECT *, xxxxx as Distance FROM table WHERE isActive = 1 
    HAVING Distance < 10 ORDER BY Distance ASC
) AS all
GROUP BY Name

グループ化されていないクエリHAVINGでは、インスタント フィルターとしてすべてのレコードGROUP BYに適用され、グループ全体に適用されるため、グループは最初にすべてのデータで満たされ、次に でフィルター処理されHAVINGます。

于 2012-06-27T14:38:45.097 に答える
0

計算列のビューを 使用して仮想テーブルを作成する xxxxx

テーブルとビューの結合を使用します。

それはより速く、最適化されます。

于 2012-06-27T14:46:47.423 に答える