我的结构很简单:
我有由多个ways
组成的points
。每个point
都有一个x和y位置。
在额外的表wayspoints
的帮助下定义了方式,该表包含列wid
和pid
。
我要做的是在给定的x和y一定距离内获取所有方式(所有点都存在)。
我通过检查点x,y与给定的x,y之差来做到这一点。
我遇到的问题是,我不希望距离内的所有点,而是希望距离内的点的每种方式的所有点。
在我没有此要求之前,我的查询运行了大约100毫秒,获取了100万个点。由于我现在需要整体上的每种方式,因此我添加了一个子查询,该子查询现在大约需要4-5秒钟来获取。
这对我来说是不可接受的。这是sql(数字是给定的x和y坐标):
SELECT concat(WAYS.id, '|',WAYS.name) "id", POINTS.x, POINTS.y
FROM WAYS, WAYPOINTS, POINTS
WHERE WAYPOINTS.WID = WAYS.ID AND
WAYPOINTS.PID = POINTS.ID AND
WAYPOINTS.WID IN (SELECT w.ID
FROM WAYS w, WAYPOINTS wp, POINTS p
WHERE wp.WID = w.ID AND wp.PID = p.ID
AND p.x < (51.739400 + 0.01)
AND p.x > (51.739400 - 0.01)
AND p.y < (8.710202 + 0.01)
AND p.y > (8.710202 - 0.01);
如果我至少可以达到最大1秒,那就太好了。我知道我要问的很多东西,因为该解决方案已经在起作用,但是我觉得这里肯定缺少某些东西。
PS:Ive已为每个有问题的列添加了索引。
最佳答案
SELECT p.*
FROM points AS pWithin
INNER JOIN waypoints AS pwWP ON pWithin.ID = pwWP.PID
INNER JOIN way AS pwW ON pwWP.WID = pwW.ID
INNER JOIN waypoints AS wp ON pwW.ID = wp.WID
INNER JOIN points AS p ON wp.PID = p.ID
WHERE pWithin.x < (51.739400 + 0.01)
AND pWithin.x > (51.739400 - 0.01)
AND pWithin.y < (8.710202 + 0.01)
AND pWithin.y > (8.710202 - 0.01);
WHERE
和points
的第一个引用查找“距离内的点”,接下来的两个联接用于查找这些点所在的方式,最后两个联接在这些方式内查找点。显然,您可以将
p.*
替换为所需的实际结果数据。编辑:您可能需要注意的一件事是,如果
way
在其“距离内”具有多个点,并且它的所有点将显示多次。只需将SELECT
更改为SELECT DISTINCT
即可轻松解决。关于mysql - 我可以避免子查询吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44708125/