我们正在开发一个现有的网站,我们无法重新构建数据库以进行更好的优化,所以不幸的是我们正在运行大量的“连接”来链接到每个表。
我们正在链接几个临时存储的邮政编码,用户帐户,体育活动,年龄组等的小表。
我不擅长优化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;
答案 0 :(得分:0)
您可以将点分类为存储桶并搜索您所在位置附近的点。你可以下载我的php类hilbert-curve @ phpclasses.org。它使用quadkey和mercator投影。