2017-05-03 78 views
0

我有數據來自3個不同的錶快到了,我需要做它們之間的一些條件選擇。 DB查詢如下:MySQL的多表連接

SELECT proddb.onrrnr, 
     proddb.onr     AS tellimus, 
     proddb.idnr    AS ID, 
     proddb.prod    AS toode, 
     proddb.proddate, 
     CASE 
     WHEN pf_prodQtySeq.glLiteNr = 1 THEN pf_ordRowSeq.gl1 
     WHEN pf_prodQtySeq.glLiteNr = 2 THEN pf_ordRowSeq.gl2 
     WHEN pf_prodQtySeq.glLiteNr = 3 THEN pf_ordRowSeq.gl3 
     WHEN pf_prodQtySeq.glLiteNr = 4 THEN pf_ordRowSeq.gl4 
     END      AS klaas, 
     Sum(pf_prodQtySeq.planQty) AS kogus  
FROM proddb 
     JOIN pf_prodQtySeq 
     ON proddb.onrrnr = pf_prodQtySeq.onrrnr 
     JOIN pf_ordRowSeq 
     ON proddb.onrrnr = pf_ordRowSeq.onrrnr 
WHERE pf_prodQtySeq.prLineSh = 'HEG' 
     AND pf_prodQtySeq.planQty > 0 
GROUP BY proddb.idnr 
ORDER BY klaas DESC LIMIT 1000,25; 

編輯:在代碼存在哪裏還ORDER和LIMIT子句,LIMIT是本果然查詢執行速度降低到10秒,而不會限制查詢需要大約小於1秒。如何優化LIMITing?

這個查詢工作確定,但它需要太多的時間來執行。此查詢大約需要5秒,但每個表只包含少於50 000行。試了兩次更快,並有更多的RAM服務器;也是同樣的時間。表格被索引。 是否有與查詢加快或我需要鞏固表。這意味着所有的數據將在一個表中。

EXPLAIN結果: enter image description here

+1

'這個查詢的工作OK' ...不是真的,因爲你在使用'集團BY'選擇非聚合列。也許添加一個關於查詢應該做什麼的描述。 –

+0

您可以嘗試使用'inner join',而不是'join'。 –

+0

使用'EXPLAIN'來檢測查詢性能改進的方式。你也可以在你的問題中顯示'EXPLAIN'結果。 – Alexander

回答

0

它看起來像你有幾個每對同一表(pf_prodQtySeq)一列索引。

你應該做的是增加一個組合索引,以便您的where -clause的兩個部分可以從索引中受益。只有一個索引可以用於表,因此您必須將兩個列放在同一個索引中才能獲得更好的性能。

alter table pf_prodQtySeq add index prLineSh_planQty (prLineSh, planQty); 
0

您的查詢執行情況良好。但使用的filesort使用臨時建議排除。 WHERE子句包含引用pf_prodQtySeq表。嘗試強制優化加入這個表中的第一個,以減少額外的MySQL經過數(見STRAIGHT_JOIN修改爲table_references clauseSELECT statementSTRAIGHT_JOIN)。爲了防止性能降低,請使用EXPLAIN監視更改。有關更多信息,另請參閱Optimizing SELECT Statements。祝你好運!