UNION 与 UNION ALL 的性能

Posted

技术标签:

【中文标题】UNION 与 UNION ALL 的性能【英文标题】:Performance of UNION vs UNION ALL 【发布时间】:2017-09-17 04:18:31 【问题描述】:

我正在通过 UNION 或 UNION ALL 从多个表中选择一列外键。

当重复无关紧要时,通常建议使用 UNION ALL 而不是 UNION 来解决性能问题。但是,在我的调用 php 脚本中,循环和操作数据而不重复会更有效。

所以,我可以使用以下任一选项:

选项 1:

在数据库中使用UNION来消除重复

选项 2:

在数据库中使用 UNION ALL 并使用 array_unique() 或其他类似函数消除我的 PHP 脚本中的数据。

我的假设是,在大多数情况下,选项 1 将是首选且更有效的方法,但是我没有什么可以支持该假设,并且不确定测试它的最佳方法,尤其是因为它可能在很大程度上取决于关于数据是什么。

我的假设在大多数情况下是否正确?如果是这样,为什么?如果没有,为什么不呢?

【问题讨论】:

测试这两个选项,你会看到。 答案是视情况而定。测试两者以找出答案。 @TimBiegeleisen 您将此链接为重复项,但是,该页面上没有任何内容可以回答我的问题。它只是重申了我在问题中已经说过的内容。 @kojow7 我不同意,如果您在两个投票率最高的答案下真实所有 cmets,您将得到您正在寻找的答案。 @TimBiegeleisen 实际上,如果您阅读了两个投票最多的答案下的所有 cmets,您会看到我大约一个小时前在那里发表了评论。我确实阅读了该帖子上的 cmets 和其他一些内容,但找不到对我的问题满意的答案。因此,我为什么在这里问一个。 【参考方案1】:

主要是 UNION 是 UNION DISTINCT 的快捷方式,所以

UNION 和 UNION ALL 的性能差异与 需要获得不同的结果,为此数据库引擎和查询优化器 肯定比应用中基于PHP代码的过滤算法更加有效和高效。

此外,dictinct 操作还可以受益于 group by 功能的预优化

不仅如此,重复数据过滤一般都是基于有序数据 虽然 select sql 函数无需显式排序即可工作, 因此,使用应用程序过滤数据的需求可能会导致效率降低和查询时间更长。

通常 db 引擎比应用程序 PHP 函数代码更有效,因此选项 1 通常是更好的选择

【讨论】:

【参考方案2】:

在速度方面,它相对微不足道。完成所有SELECTs 的工作不仅仅是进行重复数据删除,无论您采用哪种方式。

因此,我建议说UNION DISTINCT,因为这对您来说比array_unique(...) 的击键次数少。

其他注意事项:

UNION ALL 会将更多的东西从服务器铲到客户端;这(在极端或遥远的情况下)可能是影响性能的一个因素。 如果您在UNION 上也使用ORDER BY,那么您也可以使用DISTINCTGROUP BY(在UNION上)有DISTINCT的效果。 如果您谈论的是数百万行,请记住 PHP 可以达到数组的内存限制,而 mysql 基本上是无限的。

【讨论】:

你能解释一下 UNION 和 UNION DISTINCT 之间的区别吗?我以为 UNION 会自动执行 DISTINCT。 UNIONUNION DISTINCT 相同。我建议始终将其拼写出来,以便您 (1) 考虑要做什么,以及 (2) 告诉下一位 SQL 读者(可能是 6 个月后的您)您做出了有意识的决定。

以上是关于UNION 与 UNION ALL 的性能的主要内容,如果未能解决你的问题,请参考以下文章

UNION和UNION ALL两者之间在性能上的区别

union all 和 union

union 与 union all 的表现

HIVE优化(四)-union all

MySQL 中的 UNION ALL 性能不佳

union和union all 的写法