【问题标题】:Optimize Slow Lon/Lat Query with table joins使用表连接优化慢 Lon/Lat 查询
【发布时间】:2013-10-10 01:11:50
【问题描述】:

我们正在处理现有网站,我们无法重新构建数据库以进行更好的优化,因此很遗憾,我们正在运行大量“连接”以链接到每个表。

我们正在链接临时存储的邮政编码、用户帐户、体育活动、年龄组等的几个小表格。

我不擅长优化 SQL,但我需要这个查询尽可能快地运行,因为我认为它会导致我们的服务器出现问题,因为它被记录在“慢日志”文件中。基本上,我们将经度/纬度存储在特定用户的表中。然后对照第二个表检查这个 Lon/Lat,该表有一个用户列表及其 lon/lat。然后记录集根据最近的用户显示结果。不幸的是,它有大量的表连接

信息: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;

【问题讨论】:

    标签: mysql performance join query-optimization latitude-longitude


    【解决方案1】:

    您可以将点分类到存储桶中并搜索您所在位置附近的点。你可以下载我的 php 类 hilbert-curve@phpclasses.org。它使用四键和墨卡托投影。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-16
      • 2017-03-17
      • 2012-09-26
      • 2014-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多