2012-01-21 6 views
1

MySQLクエリの結合を最適化する方法についての入力はありますか?たとえば、次のクエリ複数の結合でMySQLクエリを最適化する方法はありますか?

SELECT E.name, A.id1, B.id2, C.id3, D.id4, E.string_comment 
    FROM E 
    JOIN A ON E.name = A.name AND E.string_comment = A.string_comment 
    JOIN B ON E.name = B.name AND E.string_comment = B.string_comment 
    JOIN C ON E.name = C.name AND E.string_comment = C.string_comment 
    JOIN D ON E.name = D.name AND E.string_comment = D.string_comment 

表A、Bを考慮し、C、Dは、一時テーブルであり、1096行を含み、表E(また、一時テーブル)が426行を含みます。インデックスを作成せずに、MySQL EXPLAINはすべてのテーブルからすべての行を検索していることを示していました。今度は、すべてのテーブルA、B、C、B、Eのname_idxとstring_commentという名前のFULLTEXTインデックスを作成しました。EXPLAINコマンドは、以下のように同じ結果を返しています。 また、任意のコメントどのように私はチューニングこのクエリをすることができます上の

id select_type table type possible_keys   key key_len ref rows Extra 
    1 SIMPLE  A  ALL name_idx,string_idx      1096 
    1 SIMPLE  B  ALL name_idx,string_idx      1096 Using where 
    1 SIMPLE  C  ALL name_idx,string_idx      1096 Using where 
    1 SIMPLE  D  ALL name_idx,string_idx      1096 Using where 
    1 SIMPLE  E  ALL name_idx,string_idx      426 Using where 

(15) 名とstring_commentは、タイプVARCHARとIDXのですが、int型であることに注意してください?

ありがとうございました。

答えて

1

各テーブルに対して、両方の列に複合インデックスを作成する必要があります。構文は少し変わりますが、それは次のようなものです:

CREATE INDEX comp_E_idx E(name, string_comment) 

そして、すべてのテーブルに対して繰り返します。 別々のインデックスは、マージしようとすると役に立たないので、助けになりません。インデックス内の名前をすばやく検索しますが、その後で繰り返してコメントを検索する必要があります

+0

また、ANALYZE TABLEを呼び出すと、クエリのチューニングに役立ちます。 –

0

クエリを調整できるかどうかを確認する必要があります。私はまず、データそのものを調整できるかどうか尋ねます。つまり、A、B、C、D、EのデータをNULL可能な列を持つ単一の表に入れることを検討してください。これにより、O(N^5)からO(N)までの検索の複雑さが軽減されます。