2012-03-28 10 views
0

仮定するテーブルと結合 ID、A_ID、B_ID、C_ID、D_ID、量、年、main_colMySQLの複数が、複数のテーブル、クエリのパフォーマンス上の条件

(500行): ID、a_col1、

B(2000行)a_col2: ID、b_col1、b_col2、b_col3

C(500行): ID、c_col1、c_col2

D(1000行): ID、d_col1は、

をd_col2そして、我々は次のようにクエリを持っている:

select sum(amounts), main_col 
    join a on a.id = main.a_id 
    join b on b.id = main.b_id 
    join c on c.id = main.c_id 
    join d on d.id = main.d_id 
    where a.a_col1 in (...) 
    and a.a_col2 in (..) 
    and b.b_col1 in (...) 
    and b.b_col2 in (...) 
    and b.b_col3 in (..) 
    and c.c_col1 in (..) 
    and c.c_col2 in (..) 
    and d.d_col1 in (..) 
    and d.d_col2 in (..) 
    and year = 2011 

    group by main.main_col 

クエリのパフォーマンスを向上させるためにメインテーブルにインデックスを作成するための任意のアイデアを?

おかげ

更新: インデックスは、B、Cに追加され、列のDテーブルはメインテーブルに 私が試した複数の列のインデックスに表示(A_ID、B_ID、C_ID、D_ID 、main_col)は、a_id、b_id ...に個々のインデックスを追加するような最高のパフォーマンスを持ちますが、依然として十分に高速ではないため、クエリでは最大で7秒かかります。

+0

あなたが本当にクエリを最適化するのに苦労していて、すべてを試したことがあるなら、あなたのスキーマを見たいかもしれません。パフォーマンスを改善するために、集約テーブルなどを非正規化/作成することは可能かもしれません。 – liquorvicar

答えて

1

CREATE INDEX id_main ONメイン(ID)

additioに複数のインデックスを作成することができますどのようにあなたのために働くかを見てください。

http://dev.mysql.com/doc/refman/5.0/en/create-index.html

+0

プライマリキー(id)インデックスがデフォルトで追加されています。私はメインテーブルの外部キーに複数のインデックスを追加しようとしましたが、SQLをチェックするためには説明を使用し、クエリのインデックスは選択しません。 –

+0

あなたはテーブルにプライマリ・キーを持っていたと述べておらず、インデックスを適用する方法だけではなく、あなたがやったと仮定したくありませんでした。 MySQLエンジンは、最良と思われるものに基づいて、インデックス/実行パスを選択します。クエリをパフォーマンスチューニングする方法については、この記事を読むことができます。http://www.databasejournal.com/features/mysql/article.php/1382791/Optimizing-MySQL-Queries-and-Indexes.htm –

0

主キーがすでにデフォルトでインデックス化されているので、参加するには、複数のインデックスを追加することによって最適化することができません。だからあなたのwhereステートメントを残します。したがって、x.x_colN列に索引を追加するのに役立ちます。

1

それは本当に一般的には、1つまたは複数を追加するのが賢明かもしれないなど、各テーブルがどのように大きな、どのように選択各参加などの仕様に依存だと思うあなたのGROUP_BYにインデックスをも持っている必要がありますあなたのメインテーブルの外部キーのインデックスは、その限られた情報から言うことができますか?

また、クエリの実行方法を理解するのに役立つかもしれません.MySQLの「説明」や「説明した拡張」を見てみてください。

関連する問題