在所有子查询或主查询中执行哪些操作?

时间:2015-07-21 23:54:52

标签: mysql performance

我应该在每个子查询中执行WHERE,还是仅在主查询中执行?我的问题是关于表现。例如:

所有子查询中的位置

SELECT ...
FROM ...
WHERE id_user = :id_user

UNION ALL
SELECT ...
FROM ...
WHERE id_user = :id_user

在这种情况下,每个子查询都会有相同的 WHERE子句,按id_user进行过滤。

仅适用于主查询

SELECT 
    SUBQUERY.*

FROM (
    SELECT ..., id_user
    FROM ...

    UNION ALL
    SELECT ..., id_user
    FROM ...
) AS SUBQUERY

WHERE SUBQUERY.id_user = :id_user

在这种情况下,每个子查询都将返回id_user,因此主查询将获取它并将进行过滤。

在我看来,第一个会更快,因为它会首先过滤,结合并返回所有。在第二种情况下,它会找到all,union和filter。第二种方法的优点是我会一次写WHERE - 想象我有10个类似的子查询。

但问题是:MySQL能否优化它?

1 个答案:

答案 0 :(得分:2)

MySQL实现了子查询。这意味着在进行后续处理之前,子查询已完全处理。

因此,在MySQL中,您应该将GATEWAYIP=$(ip route show | grep default | awk '{print $3}') 子句放在子查询中,以减少数据量并加快查询速度。您的第一个版本应该比第二个版本具有更好的性能。

此外,您可以删除第一个版本的外部查询。只是做:

where

在大多数其他数据库中都不是这样。