mysql查询性能低

标签 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]: /image/cgsS1.png

最佳答案

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

如果不需要,请避免嵌套子选择。

我认为在此查询中不需要它们。您可以通过这种方式查询数据 3 次,而不是一次。

速度缓慢的原因是查询效率低下,必须处理记录数量不断增加的表。

“不在”是资源密集型的。您能以更好的方式做到这一点,避免“不在”逻辑中吗?

关于mysql查询性能低,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45086104/

相关文章:

java - 如何在阿拉伯(hijri)日历中执行 'between' 并在 MySQL 中将其保存为 'date'?

mongodb - mongodb 中大嵌套数据的查询性能问题

mysql - MySQL 中可接受的分组最大值技术

sql - 确定哪个应用程序正在更改 sql 数据库值

sql-server - 什么更快 : SUM over NULL or over 0?

sql-server - 选择中左联接与子查询的奇怪问题

mysql - 如果当前时间在行的开始时间和结束时间之间,则检索行

mysql - 使用重定向从 bat 文件运行 mysql 命令

mysql - 将包含 LONGTEXT 字段的 MySQL 表索引到 Elastic Search 中

c# - MVC 4 - 报告服务和存储过程