SQLの派生テーブルのパフォーマンスの問題
-
24-10-2019 - |
質問
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;
解決
これが役立つことを願っています...ここにMySQLの作成インデックスステートメントがあります。基本的に、インデックスを追加できる場合は、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が戻ってこない原因かもしれません。
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;
他のヒント
JohnがAnserで指摘したように、ルックアップテーブルに存在するはずのインデックスは別として、消費者_ACTION_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回答のコメントを参照してください。
所属していません StackOverflow