データベースには約 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が割り当てられるようにする価値はありますか?