2016-08-17 17 views
0

このクエリをどのように動作させるかを理解するのに苦労しました。今すぐ動作するクエリがあるので、時間がかかりすぎます。mysqlクエリは300秒以上の時間を要し、20秒以上のフェッチを行い、スキーマ内の行数はわずか500,000です。

誰も私が同じ検索結果を達成するためのより良い、より速い方法を理解する助けになるでしょうか?

select 
    a.customer_id, 
    a.id aid, 
    p.id payid, 
    p.amount 
from 
    agreement a 
left join 
    payment p 
on 
    a.customer_id = p.customer_id 
where 
    p.customer_id is null 
    and a.campaign = "vsf" 
    and a.customer_id in 
    (SELECT a1.customer_id 
    FROM agreement a1 
    GROUP BY a1.customer_id 
    HAVING COUNT(a1.id) >= 2) 
+0

あなたは 'customer_id'と' campaign'のインデックスを作成しましたか?パフォーマンスに関する質問には、 'EXPLAIN ANALYZE'とテーブルサイズ、インデックス、現在の時間パフォーマンス、欲求時間などに関する情報が含まれていなければなりません。'スロー 'は相対的な用語であり、比較するには本当の価値が必要です。 \t \t [** MySQL **](http://dba.stackexchange.com/questions/15371/how-do-i-get-the-execution-plan-for-a-view) –

+0

あなたは ' SELECT 'を実行すると、500k * 500kの操作(250,000 000 000)が発生します。 – Blaztix

+1

このクエリの実行計画(EXPLAIN)を指定します。 –

答えて

0

左側に参加し、どこ..ヌルあなたが契約に存在する行を取得し、支払い に存在しないので、あなたはp.idのpayiとp.amountを選択する必要はありません、あなたは試すことができます:

select * from (SELECT a1.customer_id , a1.id aid 
    FROM agreement a1 
    where a.campaign = "vsf" 
    GROUP BY a1.customer_id 
    HAVING COUNT(a1.id) >= 2) as t 
left join 
    payment p 
on 
    t.customer_id = p.customer_id 
where 
    p.customer_id is null 
+0

これにより、クエリが5.5秒の0秒フェッチに短縮されました。ありがとうございました! – mrDave

+0

そして、a.campaignにインデックスを追加し、t.customer_idとp.customer_idに@Juanというインデックスを追加すると、Carlos Oropeza氏は言います。それはより速くなります – Imanez

+0

あなたは@mrDaveを歓迎します。問題を解決するのに最も役立った回答をマークすることを忘れないでください。 [回答を受け入れる方法は?](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) – Imanez

関連する問題