2014-05-15 108 views
3

我有一個關於一個小問題MySQL的MySQL的選擇從UNION性能問題(殺死數據庫)

我試圖讓兩個表的UNION像這樣:

SELECT `user_id`, `post_id`, `requested_on` 
    FROM `a` 
     WHERE `status` != 'cancelled' 

UNION 

SELECT `user_id`, `post_id`, `time` as requested_on 
    FROM `b` 
     WHERE `type` = 'ADD' 

此查詢在執行Showing rows 0 - 29 (36684 total, Query took 0.0147 sec)

但是當我做

SELECT * FROM (
    SELECT `user_id`, `post_id`, `requested_on` 
     FROM `a` 
     WHERE `status` != 'cancelled' 

    UNION 

    SELECT `user_id`, `post_id`, `time` as requested_on 
     FROM `b` 
     WHERE `type` = 'ADD' 
) tbl1 

MySQL的死亡。

爲什麼我想這樣做的原因是爲了GROUP BY user_id, post_id

任何想法,爲什麼發生這種情況/任何變通辦法?

後來編輯:

這是SQL小提琴:

http://sqlfiddle.com/#!2/c7f82d/2

最後的查詢是存在的,其執行:

Record Count: 10; Execution Time: 574ms

574ms的10條記錄在我看來是巨大的。

+0

你可以提供一個sqlfiddle嗎?你想在你的最終結果中使用哪個'requested_on'? – Strawberry

+0

請顯示你想要做的最後一個查詢,以及表上有什麼索引? –

+0

你死了,你意思是說你的查詢需要很長時間才能執行/使用大量的IO/CPU?另外,顯示行0-29(總計36684 ...意味着最初的查詢返回一個小子集,而第二個派生表需要整體評估爲「GROUP」 – StuartLC

回答

3

我發現問題來自哪裏。

這是我正在運行在phpMyAdmin查詢的事實,當我做了SELECT UNION SELECT一切都很好,但是當我做 SELECT * FROM (SELECT UNION SELECT) 拼版系統從PHPMyAdmin的失敗,數據庫數據庫試圖輸出到我的瀏覽器了30k行表,這就是SQL請求掛起的原因。 :(

1

目前尚不清楚是什麼問題:

SELECT * FROM (
    SELECT user_id, post_id, requested_on 
     FROM a 
     WHERE status != cancelled 
    UNION 
    SELECT user_id, post_id, time as requested_on 
     FROM b 
     WHERE type = ADD 
) tbl1 GROUP BY user_id, post_id 

手段。假設你有:

A,X,T1 A,X,T2

你想與T1或T2行?如果不要緊讓應用聚合函數如MIN:

SELECT user_id, post_id, MIN(requested_on) FROM (
    SELECT user_id, post_id, requested_on 
    FROM a 
    WHERE status <> cancelled 
    UNION 
    SELECT user_id, post_id, time as requested_on 
    FROM b 
    WHERE type = ADD 
) tbl1 
GROUP BY user_id, post_id 

的MySQL通常不處理派生表這樣很好,有沒有可以適用於在歐盟的部分任何謂詞?

+0

感謝您的時間,我發現問題來自何處。這是事實,我在PHPMyAdmin中運行查詢,當我做SELECT UNION SELECT時,一切都很好,但是當我做SELECT * FROM(SELECT UNION SELECT)時,PHPMyAdmin的分頁系統失敗,PHPMyAdmin試圖輸出到我的瀏覽器一個超過30k的行表,這就是SQL請求掛起的原因。 – Eek