2012-05-10 50 views
0

我在MySQL數據庫中有兩個表。一個表格包含默認值,另一個表格包含覆蓋值和附加值。我編寫了兩個單獨的工作SQL語句來選擇兩者中的所有元素,然後在有覆蓋時替換默認表的值。將兩個工作的SQL語句與UNION結合在一起時所有的mysql都變得無響應

SELECT 
    d.id AS did, IFNULL(i.id, d.id) AS id, d.parent_id AS parent_id, 
    IFNULL(i.content, d.content) AS content, d.order_id AS ord 
    FROM cci d 
    LEFT JOIN instructions i ON d.order_id = i.order_id 
     AND i.parent_id = d.parent_id 
     AND i.specification_id = 'SOME ID' 
    WHERE d.parent_id = 'SOME PARENT' AND d.specification_id = '1' 
UNION ALL SELECT 
    i.id AS did, i.id AS id, i.parent_id AS parent_id, 
    i.content AS content, i.order_id AS ord 
    FROM instructions i 
    WHERE i.parent_id = 'SOME PARENT' 
    AND i.specification_id = 'SOME ID' 
    AND NOT EXISTS (SELECT 1 FROM cci d WHERE d.order_id = i.order_id AND d.parent_id = i.parent_id) 

單獨的兩件工作正常,但是當我把它們放在一起MySQL峯值到90%的CPU並凍結了。很明顯,某些工作不正確。什麼會導致這樣的凍結,或者我的聲明有什麼問題嗎?

由於

編輯:

EXPLAIN的輸出是:

id | select_type   | table  | type | possible_keys | key | key_len | ref | rows | Extra 
———————————————————————————————————————————————————————————————————————————————————————————————————————— 
1 | PRIMARY    | d   | ALL | NULL   | NULL | NULL | NULL | 105 | Using where 
1 | PRIMARY    | i   | ALL | NULL   | NULL | NULL | NULL | 4 | 
2 | UNION    | i   | ALL | NULL   | NULL | NULL | NULL | 4 | Using where 
3 | DEPENDENT SUBQUERY | d   | ALL | NULL   | NULL | NULL | NULL | 105 | Using where 
NULL| UNION RESULT   | <union1,2> | ALL | NULL   | NULL | NULL | NULL | NULL | 
+0

這兩個查詢中的每一個都返回了多少條記錄?你可以爲'UNION'查詢發佈'EXPLAIN'的輸出嗎? – eggyal

+0

我發佈了EXPLAIN的結果。 – Chris

+0

你沒有*表中定義的*索引嗎? – eggyal

回答

0

的問題是優化器,其被切換到非最佳連接策略。

問題可能是「不在」與UNION ALL結合使用。

我認爲你可以重寫查詢。這裏是一個開始:

SELECT (case when d.specification_id = '1' then d.id else i.id) AS did, 
     ... 
FROM cci d LEFT JOIN 
    instructions i 
    ON d.order_id = i.order_id AND 
     i.parent_id = d.parent_id AND 
     i.specification_id = 'SOME ID' left outer join 
    cci parent 
    on d.parent_id = parent.parent_id 
WHERE d.parent_id = 'SOME PARENT' AND d.specification_id in ('1', 'SOME ID') 

另外,使用臨時表也可以解決您的問題。

+0

您提供的代碼給出與我發佈的SQL語句的前半部分相同的輸出。我需要下半部分的原因是有一些值與規格標識和parent_id匹配,但與order_id不匹配。第二個select語句應該查找這些語句並將它們添加到輸出中。有沒有辦法獲得這些補充行? – Chris

相關問題