MySQL在大型表上命令执行时间很长

时间:2017-09-22 05:41:47

标签: mysql

我目前使用以下命令比较两个表中的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命令。有什么办法可以优化吗?

1 个答案:

答案 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);

如果根据这个建议提供更多细节,请告诉我是否有更好的答案,

此致

詹姆斯