为什么UNION查询在MySQL中这么慢?

时间:2009-05-15 17:59:02

标签: mysql query-optimization union

当我优化我的2个单个查询以在不到0.02秒的时间内运行然后UNION它们时,生成的查询需要超过1秒才能运行。此外,UNION ALL比UNION DISTINCT需要更长的时间。我认为允许重复会使查询运行得更快,而不是更慢。我真的最好分开运行2个查询吗?我更愿意使用UNION。

5 个答案:

答案 0 :(得分:15)

  

当我优化我的2个单个查询以在不到0.02秒的时间内运行,然后UNION它们时,生成的查询需要1秒以上才能运行。

您的查询是否包含ORDER BY … LIMIT条款?

如果您在ORDER BY … LIMIT之后添加UNION,则会将其应用于整个UNION,并且在这种情况下不能使用索引。

如果id是主键,则此查询将是即时的:

SELECT  *
FROM    table
ORDER BY id
LIMIT 1

,但这个不会:

SELECT  *
FROM    table
UNION ALL
SELECT  *
FROM    table
ORDER BY id
LIMIT 1
  

此外,UNION ALL需要的时间超过UNION DISTINCT。我认为允许重复会使查询运行得更快而且速度更慢。

这似乎也归功于ORDER BY。对较小的集进行排序比对较大的集更快。

  

我真的最好分开运行2个查询吗?我更愿意使用UNION

您是否需要对结果集进行排序?

如果没有,只需摆脱最后的ORDER BY

答案 1 :(得分:4)

猜测: 既然你用2个联合查询一个表,可能是,mysql很难决定表的锁定策略,或者它尝试一些缓存,这在这里不起作用,因为你查询不相交的集合,尝试多线程访问(非常合理)但遇到一些锁定/并发/文件寻求问题..

工会通常也可能采用更高的安全设置,因为这两个选择必须一致。如果将它们放入单独的交易中,它们就不会。

实验: 复制表并将它们联合起来。如果我是对的,它应该更快。

可能的解决方案: 将单个文件拆分为多个文件,以实现更好的并发策略。这不会/不应该有助于解决锁定问题,但会排除数据库中的多线程/搜索问题。

了解您使用的存储引擎会很有用。

嗯,我的2美分。现在不能在这里测试。

答案 2 :(得分:3)

关于UNION

  • UNION DISTINCTUNION的默认值)一定较慢,因为它必须先收集两个结果,然后进行重复分析。但是,由于退还给客户的货品较少,因此那里可能会有一些补偿。
  • 直到最新版本,所有 all UNIONs都使用一个临时表来收集结果,因此UNION肯定比两个单独的SELECTs慢。 最近,(MySQL 5.7,MariaDB 10.1)对某些情况UNION ALL进行了改进,以将数据从一个SELECT直接传递到客户端,然后传递其他。
  • SELECT .. UNION SELECT .. ORDER BY ..等效于
    (SELECT .. UNION SELECT ..) ORDER BY ..-此
    (SELECT ..) UNION (SELECT .. ORDER BY ..)-不是这个
    建议始终在每个SELECT周围使用括号。
  • 排序(通过ORDER BY 可能会花费额外的时间来处理附加的内容(选择或并集)。 不太可能花费更少的时间。简而言之,Optimizer的目标是做最快的事情,这可能会被整理。
  • 所有这些语句都适用于InnoDB; MyISAM的支持不多,可能会缺少一些最近的优化。
  • 有时可以通过将一个SELECT变成一个OR来加速单个UNION,从而使用两个索引。

关于测试:

  • 时间为0.001,闻起来就像您之前运行过查询一样,结果已存储在“查询缓存”中。通过关闭质量控制或添加SQL_NO_CACHE可以避免这种情况。
  • 选择WHERE flag = true (or false)有几种情况:flag被索引了吗? flag几乎总是这些值之一吗?在情况下,将使用索引,并且可能比另一种情况快。
  • 如果您不同意我的任何陈述,请提供一个相反的可行示例。

答案 3 :(得分:0)

您是否可以测量响应时间而不是时间来检索所有数据?

答案 4 :(得分:0)

UNION ALL比UNION快,因为普通的UNION期望两个连接的数据集中有重复项,需要删除。如果可以(通过内部WHERE子句)确保不会重复,那么最好使用UNION ALL并让数据库引擎优化内部选择。

在分组结果的结果上使用WHERE子句太昂贵了,因为要处理的内部结果超出了需要。此外,无法处理数据库引擎的优化-结果没有任何共同点。

检查此链接以获取详细信息https://dzone.com/articles/performance-tip-for-tuning-sql-with-union