0

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

これが私が実行しようとしているクエリです。実行されず、タイムアウトするだけです。

それは成功します。本当に、私は最後の参加まで問題を切り分けました。最後の参加を削除すると、正常に機能します。しかし、最後の結合を追加すると、実行が拒否されます。

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;
4

2 に答える 2

2

これがお役に立てば幸いです...ここにいくつかのmysqlCREATEINDEXステートメントがあります。基本的に、インデックスを追加できる場合は、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);

派生テーブルは本質的に悪いわけではありませんが、この場合(以下を参照)、comm_type_idが4のconsumer_action_logからすべてのレコードをプルしています。他のテーブルへの接続はないようです。これが、SQLが返されない原因である可能性があります。

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;
于 2011-01-27T14:30:32.277 に答える
1

Johnがanserで指摘したように、ルックアップテーブルに存在する必要のあるインデックスとは別に、consumer_action_logテーブルにもCOMM_TYPE_IDのインデックスがあることを確認します。

次に、句に1つのキーワードを追加します...最適化するためにクエリエンジンに依存するのではなく、クエリが適切に整理されている場合、常に素晴らしい結果が得られます...別のサンプルをここで参照してください

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

オプティマイザが他のテーブルを調べて、何を取得するかを理解しようとしている可能性があります。私がリンクを提供した他のStackOverflowの回答のコメントを参照してください。

于 2011-01-27T14:52:56.407 に答える