mysql查询性能低下

时间:2017-07-13 16:14:36

标签: mysql sql query-performance

我的查询在过去几天内运行了大约2个小时。但     在那之前它只花了2到3分钟的时间。我无法找到     它突然变慢的原因。谁可以帮我这个事?     请找到以下查询说明计划[![在此输入图像说明] [1]]     [1] ...

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

2 个答案:

答案 0 :(得分:0)

不要使用。* 只选择您在查询中使用的数据列。

如果您不需要嵌套子选择,请避免使用嵌套子选项。

我在这个查询中看不到对它们的需求。您以这种方式查询数据3次而不是一次。

缓慢可以解释为低效查询必须处理具有越来越多记录的表。

&#34;不在&#34;是资源密集型的。你能否以更好的方式做到这一点,避免&#34;而不是&#34;逻辑?

答案 1 :(得分:0)

JOINs通常比子查询更快。 NOT IN ( SELECT ... )通常可以转换为LEFT JOIN ... WHERE id IS NULL

a中的a.exclude_data是什么?看起来像语法错误。

这些索引可能有所帮助:

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

你也需要它newsetter_event_temp,但由于这是不可能的,所以必须给出一些东西。你在运行什么版本的MySQL?也许你实际上可以CREATE TEMPORARY TABLEADD INDEX