带有LIMIT的SQL UNION是否优化了不需要的查询?

时间:2011-02-11 10:06:26

标签: sql mysql query-optimization union

假设我有一系列逐渐变得更加昂贵的查询。我可以加入所有这些联盟,但我只对前十名结果感兴趣,所以我添加一个限制。查询看起来像这样:

(SELECT col1, col2 FROM table WHERE colx = 'x')
UNION
(SELECT col1, col2 FROM table WHERE colx LIKE '%x%')
UNION
(SELECT col1, col2 FROM table WHERE colx LIKE '%x%' AND unindexedcol LIKE '%y%')
LIMIT 10

我知道这不能保证是第一个查询的前十名,因为MySQL文档说明了

  

UNION默认生成无序   行集

但实际上看起来结果是按顺序选择1然后选择2等,直到达到限制。

MySQL是否按顺序执行查询并在达到限制时停止?如果没有那么什么是更好的方法来执行这种查询样式,其中只需要一部分结果,并且优先考虑较便宜的查询以最小化执行时间?

2 个答案:

答案 0 :(得分:3)

我做了一个测试来证明MySQL没有优化那种查询: 首先,我执行此查询:

select @a1 := 0;
select @a2 := 0;

(SELECT id, @a1:=@a1+1 FROM companies)
UNION
(SELECT id, @a2:=@a2+1 FROM invoices)
LIMIT 10;

然后我观察@ a1和@ a2变量的值:

select @a1 as a1, @a2 as a2;

在我的测试中,他们是a1 = 81和a2 = 467。 因此,联合查询的单一选择不受限制。

答案 1 :(得分:2)

由于你只需要联合10行,你可以为每个子查询添加LIMIT 10,这样每个子查询最多可以返回10行。

相关问题