2011-07-28 146 views
8

我使用大量數據的分區表。根據MySQL的文檔,它是一個待辦列表上:MySQL可以並行UNION子查詢(或任何其他)?

查詢涉及聚合函數,如SUM()和COUNT()可以 容易被並行化。

...但是,我可以使用UNION子查詢實現相同的功能嗎?他們是並行的,還是我必須創建一個多線程客戶端來運行所有可能的分區鍵的併發查詢?


編輯:

的問題是不嚴格有關UNION或子查詢。我想盡可能多地使用我的查詢內核。有沒有辦法做到這一點(並確保它已經完成),而不需要將我的應用程序對齊?

關於MySQL當前並行化功能的任何優秀文檔?

+0

你的意思' 選擇a.sum,b.count 從 (SELECT SUM(X)從XXX總和)作爲 (SELECT COUNT(*)從XXX計)爲b ' (*)作爲總數,計數(*)作爲計數 從xxx ' –

+0

@Luis我不是一直只討論聚合函數。但如果我這樣做,如下所示︰'SELECT AVG(number)FROM table WHERE class = 1 UNION SELECT AVG(number)FROM table WHERE class = 2' – vbence

回答

4

,目前唯一的方法多采用比在你的應用程序中運行查詢的一個線程/內核要使用多個連接。這當然使得運行並行查詢成爲單個事務的一部分是不可能的。

+0

謝謝!我只關心我的SELECT的速度,所以交易不是真正的問題。 – vbence

+2

在PHP中,我已經能夠使用http://www.php.net/manual/en/mysqli.reap-async-query.php在4核心服務器上並行運行4個查詢。 – Mchl

1

嚴格來說,在一個較大的查詢中UNION組合在一起的不同查詢實際上並不是子查詢。

  • 該查詢按順序運行
  • 列的數據類型由第一查詢
  • 缺省情況下確定的,相同的行被丟棄(UNION默認爲DISTINCT)
  • 結果集沒有完成建設,直到所有查詢運行

...沒有辦法並行化不同的查詢,因爲它們都是同一查詢的一部分。

您可能希望嘗試從代碼中並行運行不同的查詢,然後在查詢全部完成後將結果一起混合在代碼中。

關於聯盟的文檔可以在here找到。

+0

既不是'DISTINCT'是默認的事實,也不是行類型在發送結果之前必須知道禁止並行處理。從鏈接文檔:*但是,對於單個SELECT語句使用ORDER BY並不意味着行在最終結果中出現的順序,因爲默認情況下UNION會生成無序的一組行。* – vbence

+0

ORDER BY for individual SELECTs,yes - 但沒有添加圓括號,那麼在該組查詢結尾處的ORDER BY將排序整個結果集。 – TehShrike

+0

請注意,我上面給出的列表不一定是爲什麼某些並行不可能發生的原因列表,但它們都與UNIONed查詢的不同部分如何交互有關。 – TehShrike

1

我想在這裏回答一個類似的問題。 http://forums.mysql.com/read.php?115,84453,84453

據我所知(可能是我應該已經張貼這是一個評論,但老實說,我不能在任何地方在這裏找到一個評論按鈕。)

+1

好找。如果你想解決與那個人相同的問題(他不想因爲高延遲而分裂他的查詢),你總是可以創建一個存儲過程,爲你運行多個查詢,然後一次返回它們。 – TehShrike

+2

您將獲得對50聲望的評論。請參閱http://stackoverflow.com/privileges – Mchl

+1

類似的問題,但沒有令人滿意的答案。或者是行之間的答案否? Anywas,我certailny做了我的**谷歌:MySQL平行**之前發佈的問題。 – vbence