我目前使用以下命令比较两个表中的long和lat值,并根据另一个表更新一个表中的sitecode列,如下所示:
CREATE FUNCTION great_circle_km (lon1 DOUBLE, lat1 DOUBLE, lon2 DOUBLE, lat2 DOUBLE)
RETURNS DOUBLE
RETURN 6371 * acos(cos(radians(lat1)) * cos(radians(lat2)) * cos(radians(lon2) - radians(lon1)) + sin(radians(lat1)) * sin(radians(lat2)))
UPDATE `source` SET `source`.`sitecode` = (
SELECT `sitecode` FROM `siteinfo`
ORDER BY great_circle_km(`source`.`longitude`, `source`.`latitude`, `siteinfo`.`longitude`, `siteinfo`.`latitude`)
LIMIT 1
)
但是,对于8000行的相当大的表大小,MySQL需要花费2分钟来处理并完成UPDATE命令。有什么办法可以优化吗?
答案 0 :(得分:0)
如果我在这里错过了一些内容,但ORDER BY
看起来很贵,如果两个表共享一个公共密钥,你可以尝试MIN
(或MAX
)并将其基准测试查看查询时间是否有所改善如果没有共享密钥,siteinfo
只包含一行吗?
UPDATE `source` A
SET A.`sitecode` = (SELECT MIN(great_circle_km(A.`longitude`, A.`latitude`, B.`longitude`, B.`latitude`)) FROM `siteinfo` B WHERE A.someID = B.someID);
如果根据这个建议提供更多细节,请告诉我是否有更好的答案,
此致
詹姆斯