当我优化我的2个单个查询以在不到0.02秒的时间内运行然后UNION它们时,生成的查询需要超过1秒才能运行。此外,UNION ALL比UNION DISTINCT需要更长的时间。我认为允许重复会使查询运行得更快,而不是更慢。我真的最好分开运行2个查询吗?我更愿意使用UNION。
答案 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美分。现在不能在这里测试。
答案 2 :(得分:3)
关于UNION
UNION DISTINCT
(UNION
的默认值)一定较慢,因为它必须先收集两个结果,然后进行重复分析。但是,由于退还给客户的货品较少,因此那里可能会有一些补偿。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的目标是做最快的事情,这可能会被整理。SELECT
变成一个OR
来加速单个UNION
,从而使用两个索引。关于测试:
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