我的查询在过去几天内运行了大约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
答案 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 TABLE
和ADD INDEX
。