存在公式减慢查询。需要优化

时间:2016-09-16 18:02:44

标签: mysql where exists

WHERE   
AND NOT EXISTS
      (SELECT cl.userID
        FROM campaign_list cl
        WHERE cl.userID = customer_profile.userID
        AND (cl.notes = 'report12' or cl.notes = 'report16')
        )
    AND EXISTS
      (SELECT cl.userID
        FROM campaign_list cl
        WHERE cl.userID = customer_profile.userID
        AND cl.notes = 'report11'
        )
    AND
        (SELECT max(cl.send_date)
            FROM campaign_list cl
            WHERE cl.userID = customer_profile.userID
            AND cl.notes = 'report11'
        ) > lastSuccessfulDepositDate   

如果没有这些行,查询将在大约20秒内运行。但是,使用上述行,运行大约需要3分钟。

广告系列列表只有3,700行,但它正在缓慢而稳定地增长。有关加快此查询的建议吗?

3 个答案:

答案 0 :(得分:1)

您是否拥有以下索引:<dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.12</version> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-core-asl</artifactId> <version>1.9.12</version> </dependency>?这将是三个子查询的最佳索引。

然后,我会问,你是否分别尝试过各种情况?也就是说,你知道每个人是否需要1分钟。或者,一个是00:02:59而另外两个是00:00:01?

并且,您可以简化这两个条件:

campaign_list(userID, notes, send_date)

此处适用相同的指数。

注意:WHERE AND NOT EXISTS (SELECT cl.userID FROM campaign_list cl WHERE cl.userID = customer_profile.userID AND cl.notes IN ('report12', cl.notes = 'report16') ) AND EXISTS (SELECT cl.userID FROM campaign_list cl WHERE cl.userID = customer_profile.userID AND cl.notes = 'report11' and cl.send_date > ?.lastSuccessfulDepositDate ) 在这种情况下并没有真正影响性能,但更容易编写和阅读。

答案 1 :(得分:0)

确保campiaign_list具有userID和notes

的索引

您还可以使用功能索引仅在注释=&#39; report16&#39;或者&#39; report11&#39;但这可能对整个系统有利,也可能不利。

您可能还想在同一索引中包含send_date ...

<html lang="en-gb">

此外,在您的存在查询中执行select *而不是选择列名称的速度要快得多。

另一个例子:     在campaign_list(send_date)上创建索引,其中notes =&#39; report11&#39;

答案 2 :(得分:0)

取决于每个表中的行数,&#34; IN&#34;和&#34; NOT IN&#34;可能会给你更好的结果(也取决于你的机器的配置和内存)

示例:

 where
 customer_profile.userID not in
 (
  (SELECT cl.userID
    FROM campaign_list cl
    WHERE cl.notes not in ('report12','report16')
    [perhaps some other predicate here that's also in the main query]
    )
 )...

它有助于了解每个表中的行数