我的结构很简单:
我有由多个ways组成的points。每个point都有一个x和y位置。
在额外的表wayspoints的帮助下定义了方式,该表包含列widpid

我要做的是在给定的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);


WHEREpoints的第一个引用查找“距离内的点”,接下来的两个联接用于查找这些点所在的方式,最后两个联接在这些方式内查找点。

显然,您可以将p.*替换为所需的实际结果数据。

编辑:您可能需要注意的一件事是,如果way在其“距离内”具有多个点,并且它的所有点将显示多次。只需将SELECT更改为SELECT DISTINCT即可轻松解决。

关于mysql - 我可以避免子查询吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44708125/

10-16 18:53
查看更多