2017-07-13 6 views
0

私は過去数日間で約2時間実行されているクエリを持っています。しかし、それ以前に には2〜3分しかかかりませんでした。私はその突然の遅さの理由 を見つけることができませんでした。誰にでも私を助けることができますか? 以下のクエリはプランの説明を見つけるしてください[を![ここに画像の説明を入力] [1]] [1] ...mysqlクエリのパフォーマンスが低い

select 
IFNULL(EMAIL,'') as EMAIL, 
IFNULL(SITE_CD,'') as SITE_CD, 
IFNULL(OPT_TYPE_CD,'') as OPT_TYPE_CD, 
IFNULL(OPT_IN_IND,'') as OPT_IN_IND, 
IFNULL(EVENT_TSP,'') as EVENT_TSP, 
IFNULL(APPLICATION,'') as APPLICATION 
from (
SELECT newsletter_entry.email email, 
     newsletter.site_cd site_cd, 
     REPLACE (newsletter.TYPE, 'OPTIN_','') opt_type_cd, 
     CASE 
     WHEN newsletter_event_temp.post_status = 'SUBSCRIBED' THEN 'Y' 
       WHEN newsletter_event_temp.post_status = 'UNSUBSCRIBED' THEN 
'N' 
      ELSE '' 
     END 
     opt_in_ind, 
     newsletter_event_temp.event_date event_tsp, 
     entry_context.application application 
FROM amg_toolkit.newsletter_entry, 
     amg_toolkit.newsletter, 
    (select NEWSLETTER_EVENT.* from amg_toolkit.NEWSLETTER_EVENT, 
amg_toolkit.entry_context where newsletter_event.EVENT_DATE >= '2017-07-11 
00:01:23' AND newsletter_event.EVENT_DATE < '2017-07-11 01:01:23' and 
newsletter_event.ENTRY_CONTEXT_ID = entry_context.ENTRY_CONTEXT_ID and 
entry_context.APPLICATION != 'feedbackloop') newsletter_event_temp, 
     amg_toolkit.entry_context 
WHERE newsletter_entry.newsletter_id = newsletter.newsletter_id 
     AND newsletter_entry.newsletter_entry_id = 
      newsletter_event_temp.newsletter_entry_id 
     AND newsletter.TYPE IN ('OPTIN_PRIM', 'OPTIN_THRD', 'OPTIN_WRLS') 
     AND newsletter_event_temp.entry_context_id NOT IN 
      (select d.ENTRY_CONTEXT_ID from amg_toolkit.sweepstake a, 
amg_toolkit.sweepstake_entry b, amg_toolkit.user_entry c, 
amg_toolkit.entry_context d where a.exclude_data = 'Y' and 
a.sweepstake_id=b.sweepstake_id and b.USER_ENTRY_ID=c.USER_ENTRY_ID and 
c.ENTRY_CONTEXT_ID = d.ENTRY_CONTEXT_ID) 
     AND newsletter_event_temp.entry_context_id = 
      entry_context.entry_context_id 
     AND newsletter_event_temp.event_date >= '2017-07-11 00:01:23' 
     AND newsletter_event_temp.event_date < '2017-07-11 01:01:23') a;` 




    [1]: https://i.stack.imgur.com/cgsS1.png 
+0

もしあなたがDBAを知らないのであれば、おそらくそれを見つける時間です。どちらかというと、サイズを問うクエリです。 – tadman

+0

私はそのDBAだと私はこの問題の根本的な原因を知っていません。あなたは私に解決策を説明できますか? – saravana

+0

遅くなくなるまで質問から削除してから、問題の原因を特定できるようになるまで物を追加してください。いつもと同じ。また、インデックスのカバレッジを慎重に確認したい場合もあります。私はクエリを見るたびにこの大きな私はパフォーマンスの面で悪い時代になるだろう知っている。この種のモンスターを演奏するのは非常に難しいです。 – tadman

答えて

0

を使用していけない。* は、あなたの中で使用されているデータの列のみを選択クエリ。

必要がない場合は、ネストされたサブ選択を避けてください。

このクエリでは、私には必要はありません。この方法では、1回ではなく3回データをクエリします。

スローネスは、レコード数の増加するテーブルを処理する非効率的なクエリによって説明できます。

"Not in"はリソースを大量に消費します。あなたはより良い方法でそれを "not in"ロジックを避けて行うことができますか?

0

JOINsは通常、サブクエリよりも高速です。 NOT IN (SELECT ...)は通常LEFT JOIN ... WHERE id IS NULLになります。

aa.exclude_dataとは何ですか?構文エラーのように見えます。

これらのインデックスを助ける可能性がある:

newsletter_event: INDEX(ENTRY_CONTEXT_ID, EVENT_DATE) -- in this order 

またnewsetter_event_tempのためにそれを必要とするが、それができないので、何かが与えることがあります。実行中のMySQLのバージョンは?実際にはCREATE TEMPORARY TABLEADD INDEXの可能性があります。

関連する問題