2013-03-06 95 views
3

运行此查询:为什么UNION ALL似乎要等两个查询结束?

select null, "hello" union all select sleep(4), "world"; 

在5.5.29不返回的第一行马上预期。相反,我必须等待4秒钟才能得到任何东西。 如何让MySQL立即返回第一行?

我想测试慢查询的处理。把它分开是没有意义的,因为那时我会测试别的东西。

+1

因为这只是一个**单**语句(因此只有一个结果),所以不能让它返回第一行“右”。 – 2013-03-06 17:18:58

+0

@a_horse_with_no_name:我怀疑结果集总是被完全缓冲。如果你有一张巨大的桌子,并且你选择了'SELECT *',结果马上就会出现,所以这似乎证明了这一点。那么,为什么不能排在另一排之前呢? Bill Karwin有一个答案,但没有理由为什么SQL引擎不应该能够看到查询有多简单,并且知道没有类型需要转换。 – 2013-03-06 17:22:41

+0

相关:http://dba.stackexchange.com/q/7777 – 2013-03-06 17:49:12

回答

4

我该如何让MySQL立即返回第一行?

分别运行两个查询而不是使用UNION。我承认这个答案似乎有些陈腐,但它可能是你的问题唯一真正的答案。

它必须执行第二个查询的一个原因是,UNION要求所有列在所有联合子查询中都是相同的。即数量相同,数据类型兼容。它甚至可能会根据第二个查询返回的内容(例如,将INT展开为BIGINT)来提升数据类型。所以它必须从所有子查询中返回至少一行,然后才能确定结果集第一行的数据类型。

0

您通过使用UNION ALL构造请求了单个记录集。如果你想看到一个部分跟随另一部分,告诉SQL引擎;运行第一部分作为一个查询返回记录集,然后运行第二部分作为另一个查询返回第二个记录集。这两者可以在客户端连接在一起。

+0

我想测试慢查询的处理。把它分开是没有意义的,因为那时我会测试别的东西。 – 2013-03-06 17:03:52

+1

当问题出现错误或不完整的事实时,它会提供错误或不完整的答案。将此添加到您的问题中,以便传入的读者一次查看整个问题。 – 2013-03-06 17:07:17

+0

问题连接 – 2013-03-06 17:09:31

相关问题