2016-06-15 4 views
0

私はDBを管理しています。このクエリを作成するためのよりクールな方法があるかどうかを知りたいと思います。SQLクエリが非常に遅い - どうすれば改善できますか?

私の実際のクエリ:

SELECT * FROM mytable 
LEFT JOIN table1 AS m1 ON mytable.idA=m1.K 
LEFT JOIN table1 AS m2 ON mytable.idB=m2.K 
LEFT JOIN table1 AS m3 ON mytable.idC=m3.K 
LEFT JOIN table1 AS m4 ON mytable.idD=m4.K 
LEFT OUTER JOIN table2 AS t1 ON mytable.idK1= t1.idK1 AND mytable.idK2= t1.idK2 
LEFT OUTER JOIN table3 ON t1.idT = table3.idT 
WHERE m1.K = "my_value" OR m2.K = "my_value" OR m3.K = "my_value" OR m4.K = "my_value" 

私は、フィールドIDA、IDB、IDCまたはIDDの値を持つことができるので、4が同じ他のテーブルの上に合流させるクエリを持っています。 その後、私は他のテーブルと他の2つの結合を行います。

私の質問は
このコードを改善することはできますか?よりスマートなやり方やそれに従うより良いロジックがありますか? 理論的な説明があっても、ありがとうございます。 mytable.idAmytable.idBmytable.idCmytable.idDtable1.Ktable2.idTtable2.idT

+0

テーブルに適切なインデックスがありますか? – scaisEdge

+0

私は(1)idAなどを索引付けすることを確認し、(2)ON IDA = K OR idB = K OR idC = K OR idD = K'で1つの結合を行います。あなたが欲しいもの。それについて考える。 –

+2

と名前で列を呼び出します。 *が高すぎる – NinjaDeveloper

答えて

2

は、次のことができ、これらの列のどの指標を考えてみましょう。

table2.idK1table2.idK2のインデックスを作成できるかどうかを検討してください。もう1つはmytable.idK1mytable.idK2です。私はこれと実行時間をやってみました

+2

長期的には、1つのクエリのインデックスは推奨されません。テーブルのサイズによっては、少なくとも2倍になります6つのテーブルがある場合、エンジンは6つの決定木を計算し、それを最適化する必要があります。テーブル全体の構造を共有すると、テーブルのサイズが大きくなります(インデックスが多数のディスクとメモリを占有しています)。カーディナリティを表示するためのテーブルステータス –

+0

インデックスの変更を推薦する前に、それを考えてください。 – Drew

+0

テーブルのサイズは、mytableの場合は250k、それ以外の場合は50k未満です。 – emish89

0

は本当に優れている:それは1.5だった前

SELECT * FROM (
SELECT * FROM mytable WHERE idA = "my_value" OR idB = "my_value" OR idC = "my_value" OR idD = "my_value" 
) as p1 
LEFT JOIN table1 AS m1 ON p1.idA=m1.K 
LEFT JOIN table1 AS m2 ON p1.idB=m2.K 
LEFT JOIN table1 AS m3 ON p1.idC=m3.K 
LEFT JOIN table1 AS m4 ON p1.idD=m4.K 
LEFT OUTER JOIN table2 AS t1 ON p1.idK1= t1.idK1 AND p1.idK2= t1.idK2 
LEFT OUTER JOIN table3 ON t1.idT = table3.idT 

は現在、実行時間は、0.06秒である - 2秒。


問題が発生した可能性はありますか?クエリはうまくいくようです。

関連する問題