【发布时间】:2018-06-11 16:38:36
【问题描述】:
我有以下两张表
城市
id,纬度,经度
山
id,纬度,经度
SELECT cities.id,
(SELECT id FROM mountains
WHERE SQRT(POW(69.1 * ( latitude - cities.lat ) , 2 ) +
POW( 69.1 * (cities.lon - longitude ) *
COS( latitude / 57.3 ) , 2 ) )<20 LIMIT 1) as mountain_id
FROM cities
(查询耗时 0.5060 秒。)
为了复杂性,我删除了查询的某些部分(例如 order by、where)。但是它并不真正影响执行时间。
下面的解释。
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY cities ALL NULL NULL NULL NULL 478379
2 DEPENDENT SUBQUERY mountains ALL NULL NULL NULL NULL 15645 Using where
使用 SELECT 本身不是我的问题,但是当我尝试使用给定的结果时......例如
id mountain_id
588437 NULL
588993 4269
589014 4201
589021 4213
589036 4952
589052 7625
589113 9235
589125 NULL
589176 1184
589210 4317
...更新表一切都变得非常缓慢。我几乎尝试了我所知道的一切。我确实知道依赖子查询不是最优的,但我不知道如何摆脱它。
有什么方法可以改进我的查询。也许将其更改为 JOIN?
这两个表本身没有任何共同点,只是纬度和经度不同,只有在使用计算时才会相互关联。
MariaDB 中的空间距离搜索(公里、英里)似乎尚不可用。
【问题讨论】:
-
您似乎想要彼此相距 20 英里以内的所有对(城市/山脉)。对吗?
-
这就是它现在所做的。 20 英里只是为了减少结果量。当我按距离添加顺序时(为了复杂性,我现在省略了)它给了我从 table1 到 table2 的最接近的匹配。
标签: mysql performance select subquery mariadb