假设我有一系列逐渐变得更加昂贵的查询。我可以加入所有这些联盟,但我只对前十名结果感兴趣,所以我添加一个限制。查询看起来像这样:
(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是否按顺序执行查询并在达到限制时停止?如果没有那么什么是更好的方法来执行这种查询样式,其中只需要一部分结果,并且优先考虑较便宜的查询以最小化执行时间?
答案 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行。