MySQL中的UNION ALL和LIMIT

时间:2010-10-24 13:45:26

标签: 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;

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

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

4 个答案:

答案 0 :(得分:4)

在UNION语法说明(http://dev.mysql.com/doc/refman/5.1/en/union.html)中指定:

  

UNION的默认行为是   从中删除重复的行   结果。可选的DISTINCT关键字   除了默认值之外没有任何效果   因为它也指定了   重复行删除。随着   可选的ALL关键字,重复行   不会发生移除和结果   包括所有匹配的行   SELECT语句。

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

答案 1 :(得分:2)

它对我有用我正在使用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)

答案 2 :(得分:2)

如果表非常大,则可以执行以下查询以查看MySQL优化器的智能程度如何...

(
  select * from very_large_table
  union all
  select * from very_large_table
) limit 1

可悲的是,与随后的查询相比,该查询需要很长时间。

select * from very_large_table limit 1

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

版本

  • MySQL 8.0.11

答案 3 :(得分:1)

当前,即使前几个查询中有足够的行,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;

最多可提供1000行,而扫描的最大范围不会超过3000。