MySQL中的UNION ALL和LIMIT

Fre*_*tre 19 mysql

假设我想执行此查询:

(SELECT a FROM t1 WHERE a=10 AND B=1) 
UNION ALL 
(SELECT a FROM t2 WHERE a=11 AND B=2) 
UNION ALL 
(SELECT a FROM t3 WHERE a=12 AND B=3) 
ORDER BY a LIMIT 1000;
Run Code Online (Sandbox Code Playgroud)

如果"t1"中有550个结果,"t2"中有450个结果,那么MySQL是否足够智能以跳过"t3"?

我在看MySQL文档(http://dev.mysql.com/doc/refman/5.1/en/union.html)但似乎无法找到答案.

Yuv*_*val 11

目前,即使前几个查询中有足够的行,MySQL 也会对联合执行所有选择,正如@Yuki Inoue 在他们的回答中提到的那样。使用@user1477929 的回答,您可以将查询重写为:

(SELECT a FROM t1 WHERE a=10 AND B=1 LIMIT 1000) 
UNION ALL 
(SELECT a FROM t2 WHERE a=11 AND B=2 LIMIT 1000) 
UNION ALL 
(SELECT a FROM t3 WHERE a=12 AND B=3 LIMIT 1000) 
ORDER BY a LIMIT 1000;
Run Code Online (Sandbox Code Playgroud)

这最多会给你 1000 行,并且永远不会扫描超过 3000。


小智 5

它对我有用,我正在使用 MySQL。

但请确保所有人的限制数量始终相同

在该示例中,它会从每个表中获取 3 个结果

 (SELECT a FROM t1 WHERE a=10 AND B=1 LIMIT 9) 
 UNION ALL 
 (SELECT a FROM t2 WHERE a=11 AND B=2 LIMIT 9) 
 UNION ALL 
 (SELECT a FROM t3 WHERE a=12 AND B=3 LIMIT 9)
Run Code Online (Sandbox Code Playgroud)


Yuk*_*oue 5

如果您有一个非常大的表,那么您可以执行以下查询以查看 MySQL 优化器的智能程度...

(
  select * from very_large_table
  union all
  select * from very_large_table
) limit 1
Run Code Online (Sandbox Code Playgroud)

遗憾的是,与以下查询相比,此查询需要很长时间。

select * from very_large_table limit 1
Run Code Online (Sandbox Code Playgroud)

似乎每当UNION需要结果时,MySQL首先计算UNION结果的整个临时表。

版本

  • MySQL 8.0.11


Kel*_*Kel 4

如 UNION 语法描述 (http://dev.mysql.com/doc/refman/5.1/en/union.html) 中指定:

UNION 的默认行为是从结果中删除重复的行。可选的 DISTINCT 关键字除了默认值外没有任何作用,因为它还指定重复行删除。使用可选的 ALL 关键字,不会发生重复行删除,并且结果包括所有 SELECT 语句中的所有匹配行。

我想,这就是你问题的答案。