mysql - 在所有子查询或主查询中执行 where 操作?

标签 mysql performance

我应该在每个子查询中执行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/

相关文章:

mysql - 检查教授和房间的时间表是否有冲突

algorithm - 找到给定音调和 987654321 的除法余数

x86-64 程序集的性能优化 - 对齐和分支预测

mysql - InnoDB聚集复合索引的行为

c++ - 有没有一种快速方法可以将所有 vector 值 'move' 移动 1 个位置?

php - 用手指在移动 Web 应用程序中滑动页面

c# - 获取别名列总和的 SQL 子查询

mysql - 从另一个表的数据生成一个表

sql - 在 MySQL 中使用文本而不是 varchar 类型的实际性能影响是什么?

mysql - 如何加快 MySQL 表连接