假设我想执行此查询:
(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)
如果您有一个非常大的表,那么您可以执行以下查询以查看 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结果的整个临时表。
如 UNION 语法描述 (http://dev.mysql.com/doc/refman/5.1/en/union.html) 中指定:
UNION 的默认行为是从结果中删除重复的行。可选的 DISTINCT 关键字除了默认值外没有任何作用,因为它还指定重复行删除。使用可选的 ALL 关键字,不会发生重复行删除,并且结果包括所有 SELECT 语句中的所有匹配行。
我想,这就是你问题的答案。