UNION 与 UNION ALL 的性能对比

Performance of UNION vs UNION ALL

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

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

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

选项 1:

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

选项 2:

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

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

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

主要方面是 UNION 是 UNION DISTINCT 的快捷方式,因此

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

此外,dictinct 操作可以受益于按功能分组的预优化

不仅如此,重复数据过滤一般是根据有序数据 而 select sql 函数在没有明确排序的情况下工作, 因此,需要使用应用程序过滤数据会导致效率降低和查询时间更长。

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

速度方面,相对来说是微不足道的。完成所有 SELECTs 的工作比执行重复数据删除要多,无论您采用哪种方式。

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

其他注意事项:

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