SQL查询性能 - 在SELECT和WHERE中进行相同的计算

时间:2016-10-11 06:51:16

标签: mysql sql performance geospatial

我正在使用MySQL。假设我有一个表test(id, x) - 数据类型不重要 - 以及以下查询

SELECT id
FROM test
WHERE F(x) <= 1000;

此外,我们假设F是一个“或多或少复杂”的功能。现在,如果我将查询更改为:

,会产生什么影响
SELECT id, F(x)
FROM test
WHERE F(x) <= 1000;

也就是说,我需要F(x)的结果不仅是WHERE条件,还需要SELECT子句中的输出。我可以安全地假设MySQL足够聪明,每行只计算一次吗?

(如果需要信息,在我的具体情况下,我使用MySQL空间函数ST_WITHIN,ST_GEOMFROMTEXT等处理地理坐标。)

2 个答案:

答案 0 :(得分:3)

我认为使用派生表是一个很好的解决方案:

SELECT t1.id, t1.res
FROM (
  SELECT id, F(x) as res
  FROM test
) AS t1
WHERE t1.res <= 1000;

答案 1 :(得分:2)

聚合不能在WHERE中使用,而是在HAVING中使用。您需要添加GROUP BY子句。

SELECT id, F(x) as fx
FROM test
HAVING fx <= 1000;

如果条件引用聚合函数,请将该条件放在HAVING子句中。否则,请使用WHERE子句。

您可以使用HAVING,但建议您使用GROUP BY。

SQL Standard说WHERE在返回行之前限制结果集,HAVING在带来所有行之后限制结果集。所以WHERE更快。