運行此查詢:爲什麼UNION ALL似乎要等兩個查詢結束?
select null, "hello" union all select sleep(4), "world";
在5.5.29不返回的第一行馬上預期。相反,我必須等待4秒鐘才能得到任何東西。 如何讓MySQL立即返回第一行?
我想測試慢查詢的處理。把它分開是沒有意義的,因爲那時我會測試別的東西。
運行此查詢:爲什麼UNION ALL似乎要等兩個查詢結束?
select null, "hello" union all select sleep(4), "world";
在5.5.29不返回的第一行馬上預期。相反,我必須等待4秒鐘才能得到任何東西。 如何讓MySQL立即返回第一行?
我想測試慢查詢的處理。把它分開是沒有意義的,因爲那時我會測試別的東西。
我該如何讓MySQL立即返回第一行?
分別運行兩個查詢而不是使用UNION。我承認這個答案似乎有些陳腐,但它可能是你的問題唯一真正的答案。
它必須執行第二個查詢的一個原因是,UNION要求所有列在所有聯合子查詢中都是相同的。即數量相同,數據類型兼容。它甚至可能會根據第二個查詢返回的內容(例如,將INT展開爲BIGINT)來提升數據類型。所以它必須從所有子查詢中返回至少一行,然後才能確定結果集第一行的數據類型。
您通過使用UNION ALL構造請求了單個記錄集。如果你想看到一個部分跟隨另一部分,告訴SQL引擎;運行第一部分作爲一個查詢返回記錄集,然後運行第二部分作爲另一個查詢返回第二個記錄集。這兩者可以在客戶端連接在一起。
我想測試慢查詢的處理。把它分開是沒有意義的,因爲那時我會測試別的東西。 – 2013-03-06 17:03:52
當問題出現錯誤或不完整的事實時,它會提供錯誤或不完整的答案。將此添加到您的問題中,以便傳入的讀者一次查看整個問題。 – 2013-03-06 17:07:17
問題連接 – 2013-03-06 17:09:31
因爲這只是一個**單**語句(因此只有一個結果),所以不能讓它返回第一行「右」。 – 2013-03-06 17:18:58
@a_horse_with_no_name:我懷疑結果集總是被完全緩衝。如果你有一張巨大的桌子,並且你選擇了'SELECT *',結果馬上就會出現,所以這似乎證明了這一點。那麼,爲什麼不能排在另一排之前呢? Bill Karwin有一個答案,但沒有理由爲什麼SQL引擎不應該能夠看到查詢有多簡單,並且知道沒有類型需要轉換。 – 2013-03-06 17:22:41
相關:http://dba.stackexchange.com/q/7777 – 2013-03-06 17:49:12