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行,但它正在缓慢而稳定地增长。有关加快此查询的建议吗?
答案 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]
)
)...
它有助于了解每个表中的行数