2

执行 MySQL 查询时,是否所有数据都在计算任何字段之前被 WHERE 条件过滤?

我有一个应用程序,我需要按距离排序,但需要计算查询中与 lat/lng 的距离(发现这应该涵盖其中的那一部分(第 8 页)),但它提到查询相当慢。我想知道 MySQL 是否会计算出每个数据库条目的距离然后过滤这些结果,或者是否会先过滤结果?

编辑:

我没有说得很清楚 - 我只需要在这个阶段订购结果。按距离过滤也很好,但这始终是其他标准的次要 - 即类型总是需要是酒店,然后才重要它与坐标的距离有多近

4

1 回答 1

1

WHERE 直接作用于行,这也是您不能在 WHERE 子句中指定列别名的原因。这将导致未知列错误。

您可以使用 HAVING 或子查询。在这两种情况下,都将计算所有行的结果,然后进行过滤。

更新:

您必须按距离过滤,对吗?所以你不能先过滤行,然后计算距离。但是你可以做的是使用空间扩展。然后你会有空间索引,这可以让你的查询非常快,我猜(从来没有与这样的事情有任何关系)。

在此处阅读更多相关信息。

更新 2:

其实我完全不明白你的问题是什么。你想按你必须先计算的东西来订购。那么问题是什么?会很快吗?我不知道。我只能说,因为 MySQL 不支持计算列上的索引,所以不能使用索引。可能还会使用一个临时表来对您获得的任何数据进行排序,这取决于它有多少数据。我建议尝试一下

做就是了

SELECT coordA, coordB
FROM whereever
ORDER BY coordA - coordB

就是这样。当你有问题时,再问一次。

稍后过滤

SELECT * FROM (
SELECT coordA, coordB, coordA - coordB AS distance
FROM whereever
ORDER BY distance
) sq
WHERE distance > $foo

当使用索引和/或前面提到的扩展名太慢时。

于 2013-04-15T12:29:25.277 回答