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
,那么您也可以使用DISTINCT
。
GROUP BY
(在UNION
上)有DISTINCT
的效果。
如果您谈论的是数百万行,请记住 PHP 可以达到数组的内存限制,而 mysql 基本上是无限的。
【讨论】:
你能解释一下 UNION 和 UNION DISTINCT 之间的区别吗?我以为 UNION 会自动执行 DISTINCT。UNION
与UNION DISTINCT
相同。我建议始终将其拼写出来,以便您 (1) 考虑要做什么,以及 (2) 告诉下一位 SQL 读者(可能是 6 个月后的您)您做出了有意识的决定。以上是关于UNION 与 UNION ALL 的性能的主要内容,如果未能解决你的问题,请参考以下文章