假设我想执行此查询:
(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),但似乎无法找到答案。
答案 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结果的整个临时表。
答案 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。