2011-01-26 31 views
0

MySQLで派生テーブルを使用する際に問題があります。派生テーブルを使用すると、本質的にクエリの処理が遅くなるのですか?SQLの派生テーブルのパフォーマンスの問題

ここでは、実行しようとしているクエリです。それは実行されず、タイムアウトします。

成功します。本当に、私は最後の参加に問題を切り分けました。最後の参加を取り除くとうまくいきます。しかし、最後の結合を追加すると、実行を拒否します。

SELECT cr.COMMUNICATIONS_ID AS ANSWER_ID, 
     cr.CONSUMER_ID as VIEWER_ID, 
     cr.ACTION_LOG_ID, 
     nc.PARENT_COMMUNICATIONS_ID AS QUESTION_ID, 
     nc.SENDER_CONSUMER_ID AS REPLIER_ID, 
     ces.EXPERT_SCORE AS REPLIER_EXPERTISE, 
     cim.CONSUMER_INTEREST_EXPERT_ID AS DOMAIN 
    FROM (SELECT 234 AS CONSUMER_ID, 
    ACTION_LOG_ID, 
    COMMUNICATIONS_ID 
    FROM consumer_action_log 
    WHERE COMM_TYPE_ID=4) AS cr 
JOIN network_communications AS nc ON 
cr.COMMUNICATIONS_ID=nc.COMMUNICATIONS_ID 
JOIN communication_interest_mapping AS cim ON 
nc.PARENT_COMMUNICATIONS_ID=cim.COMMUNICATION_ID 
JOIN consumer_expert_score AS ces ON 
nc.SENDER_CONSUMER_ID=ces.CONSUMER_ID 
     AND cim.CONSUMER_INTEREST_EXPERT_ID=ces.CONSUMER_EXPERT_ID; 
+0

サブクエリを単独で実行するとどうなりますか?それは成功するか?私は、サブクエリの説明をそれ自身で行い、次にもう1つはクエリ全体について説明します。 – TehShrike

+0

成功します。本当に、私は最後の参加に問題を切り分けました。最後の参加を取り除くとうまくいきます。しかし、最後の結合を追加すると、実行を拒否します。 – Spencer

+1

そのクエリのEXPLAINの結果はどうなりますか?各テーブルのconsumer_id/expert_idの両方にインデックスがありますか?私は各テーブルの両方の列をカバーするインデックスをお勧めします。 – TehShrike

答えて

2

希望します...これはいくつかのmysql CREATE INDEXステートメントです。基本的に、インデックスを追加できる場合は、2つ以上のテーブルを接続する各列をカバーするインデックスがあることを確認してください。

CREATE INDEX idx_nc 
ON network_communications(COMMUNICATIONS_ID); 

CREATE INDEX idx_cim 
ON communication_interest_mapping(COMMUNICATION_ID); 

CREATE INDEX idx_ces 
ON consumer_expert_score(CONSUMER_ID, CONSUMER_EXPERT_ID); 

派生テーブルは、本質的には悪くないですが、この場合には、あなたが4のcomm_type_idを持っているconsumer_action_logからすべてのレコードを引っ張っているバック接続にはないようです(下記参照します)他のテーブル。これは、SQLが決して戻ることのない原因かもしれません。ジョンによってANSERで指摘したように、あなたのルックアップテーブルに存在しなければならないインデックスは別に

SELECT cr.COMMUNICATIONS_ID, 
      cr.CONSUMER_ID, 
      cr.ACTION_LOG_ID, 
      nc.PARENT_COMMUNICATIONS_ID, 
      nc.SENDER_CONSUMER_ID, 
      ces.EXPERT_SCORE, 
      cim.CONSUMER_INTEREST_EXPERT_ID 

    FROM (SELECT 234 AS CONSUMER_ID, 
      ACTION_LOG_ID, 
      COMMUNICATIONS_ID 
      FROM consumer_action_log 
      WHERE COMM_TYPE_ID=4) AS cr 

JOIN network_communications AS nc ON 
     cr.COMMUNICATIONS_ID=nc.COMMUNICATIONS_ID 

JOIN communication_interest_mapping AS cim ON 
     nc.PARENT_COMMUNICATIONS_ID=cim.COMMUNICATION_ID 

JOIN consumer_expert_score AS ces ON 
     nc.SENDER_CONSUMER_ID=ces.CONSUMER_ID 
     AND cim.CONSUMER_INTEREST_EXPERT_ID=ces.CONSUMER_EXPERT_ID; 
1

、私はあなたがあまりにもあなたのconsumer_action_logテーブルにCOMM_TYPE_IDにインデックスを持っていることを確認します。

その後、see another sample here

SELECT STRAIGHT_JOIN 
     cr.COMMUNICATIONS_ID AS ANSWER_ID, 
     cr.CONSUMER_ID as VIEWER_ID, 
     etc... rest of your query... 

それはかもしれない...クエリがうまく代わりoptimzeするクエリエンジンに依存するので編成されているとき、私はいつも素晴らしい結果を見てきました...あなたの句にキーワードを1つ追加オプティマイザが他のテーブルを調べて何を得るかを把握しようとしているかどうか。他のStackOverflow答えのコメントを参照してください。

関連する問題