我应该在每个子查询中执行WHERE
,还是只在主查询上执行?我的问题是关于性能的。例如:
所有子查询中的 WHERE:
SELECT ...
FROM ...
WHERE id_user = :id_user
UNION ALL
SELECT ...
FROM ...
WHERE id_user = :id_user
在这种情况下,每个子查询将具有相同 WHERE
子句,并按 id_user
进行过滤。
仅在主查询上使用 WHERE:
SELECT
SUBQUERY.*
FROM (
SELECT ..., id_user
FROM ...
UNION ALL
SELECT ..., id_user
FROM ...
) AS SUBQUERY
WHERE SUBQUERY.id_user = :id_user
在这种情况下,每个子查询都会返回id_user
,因此主查询将获取它并进行过滤。
在我看来,第一个会更快,因为它会先过滤、合并并返回全部。在第二种情况下,它将查找全部、联合和过滤。第二种方法的优点是我只需编写一次 WHERE
—— 假设我有 10 个类似的子查询。
但问题是:MySQL 能够对其进行优化吗?
最佳答案
MySQL 实现子查询。这意味着在进行后续处理之前子查询已完全处理。
因此,在MySQL中,应该将where
子句放在子查询中,以减少数据量并加快查询速度。您的第一个版本应该比第二个版本具有更好的性能。
此外,您可以删除第一个版本的外部查询。只要这样做:
(SELECT ...
FROM ...
WHERE id_user = :id_user
) UNION ALL
(SELECT ...
FROM ...
WHERE id_user = :id_user
)
大多数其他数据库并非如此。
关于mysql - 在所有子查询或主查询中执行 where 操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31551608/