0

私たちは既存のウェブサイトに取り組んでおり、データベースを再構築して最適化することはできません。そのため、残念ながら、各テーブルにリンクするために多くの「結合」を実行しています。

一時的に保存された郵便番号、ユーザー アカウント、スポーツ活動、年齢層などのいくつかの小さなテーブルをリンクしています。

SQL の最適化は得意ではありませんが、「低速ログ」ファイルに記録されるため、サーバーに問題を引き起こしていると思われるため、このクエリをできるだけ速く実行する必要があります。基本的に、特定のユーザーの経度/緯度をテーブルに保存しています。この経度/緯度は、経度/緯度を持つユーザーのリストを含む 2 番目のテーブルに対してチェックされます。レコードセットは、最も近いユーザーに基づいて結果を表示します。残念ながら、大量のテーブル結合があります

Info: Query_time: 5 Lock_time: 0 Rows_sent: 10 Rows_examined: 18823691

SELECT *,
   ( 3959 * acos
      ( cos
         ( radians(TableA.user_latitude)
      ) * cos
         ( radians( TableB.latitude ) )
        * cos( radians( TableB.longitude ) - radians(TableA.user_longitude) ) + sin( radians(TableA.user_latitude) ) * sin( radians( TableB.latitude ) ) ) )

AS distance FROM
   (
      (
         (
            (
               TableC JOIN TableD on TableC.activity_sport = TableD.sport_ID
            )
         JOIN TableA on TableC.activity_UserID = TableA.user_ID
         )
      LEFT JOIN TableE on TableE.TSageCatID = TableA.user_age
      )
   JOIN TableB on TableB.postcode = 'SE1 7PB'
   )

LEFT JOIN TableF on TableF.log_UserID = TableA.user_ID
WHERE TableA.user_age LIKE '%'
AND TableA.user_gender LIKE '%'
AND TableC.activity_sport LIKE '63'
AND TableC.activity_level LIKE '%'
AND TableA.valid = 1
AND TableA.user_ID != '-1'
AND TableA.user_Level = 'partner'

GROUP BY user_email
HAVING DISTANCE < 50
ORDER BY distance ASC
LIMIT 120, 10;
4

1 に答える 1

0

ポイントをバケットに並べ替えて、現在地周辺の近くのポイントを検索できます。私の php クラス hilbert-curve @ phpclasses.org をダウンロードできます。クワッドキーとメルカトル図法を使用します。

于 2013-10-03T12:00:40.400 に答える