2017-05-03 7 views
0

私は3つの異なるテーブルから来るデータを持っており、それらの間で条件付き選択をする必要があります。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; 

EDIT:コードでもORDERとLIMIT句は、LIMITダウン10秒にクエリの実行速度を回動する本であるが、LIMITクエリが1未満秒程度かかりずに次のようにDBクエリがあります。 LIMITingを最適化する方法

このクエリは正常に機能しますが、実行には時間がかかります。このクエリには約5秒かかりますが、各テーブルは50,000行未満です。また、2倍の速度で、より多くのRAMサーバーを試しました。同じ時間。テーブルのインデックスが作成されます。 高速化のためにクエリと関連があるのですか、テーブルを統合する必要があります。つまり、すべてのデータが1つのテーブルに格納されます。あなたが同じテーブルの上に1列(pf_prodQtySeq)のためのいくつかのインデックスをそれぞれ持っているように見えます enter image description here

+1

'このクエリは正常に動作します。 '...実際には、GROUP BYを使用している間に非集計カラムを選択しているためです。クエリーが何をすべきかについての記述を追加するかもしれない。 –

+0

'join'の代わりに' inner join'を試すことができます。 –

+0

クエリのパフォーマンス向上の方法を検出するには、 'EXPLAIN'を使用します。また、あなたの質問に 'EXPLAIN'の結果を表示することができます。 – Alexander

答えて

0

は結果を説明します。

あなたがする必要があるのは、whereの両方の部分がインデックスから利益を得ることができるように、結合されたインデックスを追加することです。 1つの表に対して使用できる索引は1つだけなので、パフォーマンスを向上させるためには両方の列を同じ索引に入れる必要があります。

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

実行中のクエリは良好です。しかしファイルを使用する一時的にを使用することをお勧めします。 WHERE句には、pf_prodQtySeqテーブルの参照が含まれます。 MySQLの追加パス数を減らすために、オプティマイザがこのテーブルに最初に参加するようにしてください(SELECT statementSTRAIGHT_JOIN修飾子またはtable_references clauseSTRAIGHT_JOINの修飾子を参照してください)。パフォーマンスの低下を防ぐには、EXPLAINで変更を監視してください。詳細については、Optimizing SELECT Statementsも参照してください。がんばろう!