2014-02-28 51 views
0

以下是需要400秒加載的查詢。我直接嘗試在MySQL中。如果我單獨嘗試子查詢,所有得到執行不到0.01秒。在40秒內查詢所有異能。全體工會在1秒之前執行查詢。mysql查詢需要400秒才能執行

銷售表和銷售表均包含約12K條記錄。這個查詢的目的是當銷售額=銷售表中的子公司時,我需要添加銷售表中與銷售表中的搜索條件相匹配的銷售表中的行。

(
SELECT 'no' AS aff, ss.orderid,ss.saletype,ss.price,ss.salests 
    FROM sales ss 
    WHERE 1=1 AND 
     (ss.vendor='3kpertrade' OR ss.affiliate='3kpertrade') 
) 

UNION ALL 

( 
SELECT 'yes' AS aff, sf.orderid,sf.saletype,sf.price,sf.salests 
FROM salesaff sf 
WHERE sf.vendor=sf.affiliate AND 
sf.orderid IN (SELECT ss.orderid from sales ss WHERE 1=1 
       AND (ss.vendor='3kpertrade' OR ss.affiliate='3kpertrade') 
       GROUP BY ss.orderid) 
) 

ORDER BY salests DESC 
+3

What Where with Where 1 = 1 business?沒有必要。另外,請格式化您的SQL,以便我們可以讀取它。 –

+1

嘗試沒有按順序的條款,看看它是如何去。 – Koshera

+0

1 = 1將寫入動態查詢,以便我可以從腳本添加AND column = condition。我刪除了1 = 1,並且沒有改變性能。 – user3144629

回答

0

嘗試推出這樣的:

EXPLAIN (SELECT 'no' AS aff, ss.orderid,ss.saletype,ss.price,ss.salests FROM sales ss WHERE 1=1 AND (ss.vendor='3kpertrade' OR ss.affiliate='3kpertrade')) 

UNION ALL 

(SELECT 'yes' AS aff, sf.orderid,sf.saletype,sf.price,sf.salests FROM salesaff sf WHERE sf.vendor=sf.affiliate AND 

sf.orderid IN (SELECT ss.orderid from sales ss WHERE 1=1 AND (ss.vendor='3kpertrade' OR ss.affiliate='3kpertrade') GROUP BY ss.orderid)) 

ORDER BY salests DESC 

檢查「密鑰」列是永遠不能爲null,否則索引添加到提及列。

它沒有幫助,看看這個答案:https://dba.stackexchange.com/questions/7806/copying-to-tmp-table-extremely-slow

+0

鍵總是空的 – user3144629

+0

恩,好像你沒有索引。 試試這個: 'ALTER TABLE銷售 添加項key_vendor(供應商), 添加項key_salests(salests), 添加項key_affilate(子公司);' 'ALTER TABLE salesaff 添加項key_vendor(供應商), ADD KEY key_salests(salests), ADD KEY key_affilate(affiliate);' 然後重新啓動查詢。 – Bobby

+0

對不起,更正了我的評論。 – Bobby

0

我認爲這是試圖在查詢執行期間訂購。這可能有所幫助:

SELECT * FROM (
(
SELECT 'no' AS aff, ss.orderid,ss.saletype,ss.price,ss.salests 
    FROM sales ss 
    WHERE 1=1 AND 
     (ss.vendor='3kpertrade' OR ss.affiliate='3kpertrade') 
) 

UNION ALL 

( 
SELECT 'yes' AS aff, sf.orderid,sf.saletype,sf.price,sf.salests 
FROM salesaff sf 
WHERE sf.vendor=sf.affiliate AND 
sf.orderid IN (SELECT ss.orderid from sales ss WHERE 1=1 
       AND (ss.vendor='3kpertrade' OR ss.affiliate='3kpertrade') 
       GROUP BY ss.orderid) 
) 
) 
ORDER BY salests DESC 
+0

錯誤:每個派生表都必須有自己的別名 – user3144629

+0

嘗試將別名放入聯合中的兩個查詢:select * from((query 1)union all(query 2)b)order by ... – Koshera

+0

導致語法錯誤。 – user3144629

相關問題