2017-06-01 7 views
0

結果は適切ですが、実行に時間がかかりすぎます。クエリを最適化して実行時間を短縮できますか?内部結合とサブクエリを使用してSQLクエリと返り値を最適化する方法

SELECT c.client_id 
FROM client_master c 
INNER JOIN user_visit_record u ON u.client_id = c.client_id 
WHERE c.dept_id ='1' 
    AND c.branch_id='1' 
    AND c.client_status IN('Hot','Warm','Cold','Quotation') 
    AND u.next_followup_date < '2017-06-01' 
    AND u.visit_id IN 
    (SELECT max(visit_id) 
    FROM user_visit_record 
    WHERE client_id=c.client_id) 

ありがとうございます。

私は、クエリに*使用している
+1

visit_idフィールドとclient_idのインデックスを確認します。 –

+0

インデックスを使用していません – Vijaya

+0

おそらく、関連する列のインデックスを作成すると、速度が大幅に向上します。 –

答えて

0

、あなたが行うことができますが、選択だけで必要な列、

を最適化する一つの方法であるとMySQLがいくつかの既存のソリューションを持って、ここでは、このArticle

SELECT c.client_id 
    FROM 
     (SELECT * 
     FROM client_master 
     WHERE dept_id ='1' 
       AND branch_id='1' 
       AND IN('Hot','Warm','Cold','Quotation')) AS c 
    INNER JOIN 
     (SELECT * 
     FROM user_visit_record 
     WHERE next_followup_date < '2017-06-01' 
       AND visit_id IN 
      (SELECT max(visit_id) 
      FROM user_visit_record 
      WHERE client_id=c.client_id)) AS u 
      ON u.client_id = c.client_id 
1

を確認する最適化されていますクエリ:

SELECT c.client_id 
FROM client_master c 
JOIN (SELECT * FROM user_visit_record u ORDER BY u.visit_id DESC) AS t ON t.client_id = c.client_id 
WHERE c.dept_id ='1' 
AND c.branch_id='1' 
AND c.client_status IN('Hot','Warm','Cold','Quotation') 
AND t.next_followup_date < '2017-06-01' 
GROUP BY t.clientid 
+0

ありがとうございます@Kruti Patel ..しかし、このクエリは間違った結果を取得します。 – Vijaya

+0

これに対して別の解決策を得ることができますか? – Vijaya

0

これを試してみてください。

SELECT client_id FROM 
    (
    SELECT client_id 
     FROM client_master 
     WHERE dept_id ='1' AND branch_id='1' AND client_status IN('Hot','Warm','Cold','Quotation') 
) AS c 

    NATURAL JOIN 

    (
    SELECT client_id 
     FROM user_visit_record 
     INNER JOIN (
      SELECT client_id, max(visit_id) as max_visit 
      FROM user_visit_record 
       GROUP BY client_id 
     ) AS max_user_visit 
      ON (user_visit_record.client_id = max_user_visit.client_id) 
       AND (user_visit_record.visit_id = max_visit) 
     WHERE next_followup_date < '2017-06-01' 
) AS u 
関連する問題