UNION与UNION ALL的表现

时间:2017-09-17 04:18:31

标签: php mysql performance union union-all

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

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

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

选项1:

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

选项2:

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

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

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

2 个答案:

答案 0 :(得分:2)

主要方面是UNION是UNION DISTINCT的捷径,所以

UNION和UNION ALL之间的性能差异与中国有关 需要获得一个独特的结果,为此数据库引擎和查询优化器  肯定比基于应用程序中的PHP代码的filtring alogoritm更有效和最有效。

此外,dictinct Operation还可以从逐个功能的预优化中受益

不仅重复数据过滤通常基于有序数据 而select sql函数在没有显式排序的情况下工作, 因此,需要使用应用程序过滤数据可能会导致查询效率降低和更长时间。

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

答案 1 :(得分:1)

速度方面,这是相对微不足道的。完成所有SELECTs工作的努力不仅仅是去重复,无论你采取哪种方式。

因此,我建议您说UNION DISTINCT,因为对您来说只需按键array_unique(...)

其他考虑因素:

  • UNION ALL会将更多内容从服务器转移到客户端;这(在极端或遥远的情况下)可能是表现的一个因素。
  • 如果您也在ORDER BY上说UNION,那么您也可以DISTINCT
  • GROUP BY(在UNION上)具有DISTINCT的效果。
  • 如果你在谈论数百万行,请记住PHP可以达到数组的内存限制,而MySQL本质上是无限的。