从多个表中选择和sum与join和sum

时间:2013-07-09 09:12:56

标签: sql mysqli

我正在一家广告公司实习,我已经实施了一个工具,从facebook收集所有必要的数据并将其导入数据库。

现在我试图操纵这些数据,首先是制作一些测试用例并获得一些结果。这些表每天增加35k行,因此在使用该工具一个月后,我注意到我用来获取某些adcreatives点击总和的查询开始变慢。

我在问我使用的查询是否可以加速,如果我使用它加入和如何。

这是我对每个adcreative点击总和的查询(adgroup_id,campaign_id连接到其他表):

<!-- language-all: lang-sql -->
SELECT t1.adgroup_id, t1.campaign_id, t1.creative_ids, SUM( t2.clicks ) AS clicks
FROM adgroups t1, adgroup_stats t2
WHERE t1.adgroup_id = t2.adgroup_id
GROUP BY t1.creative_ids
ORDER BY clicks DESC 

目前在专用服务器上完成查询需要3秒钟,我想在6个月之后,随着表格的增长,它将超过60秒左右。

编辑:这是查询的解释(虽然这是我第一次真正使用它而不太确定它是什么意思)

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  t2  ALL PRIMARY NULL    NULL    NULL    671549  Using temporary; Using filesort
1   SIMPLE  t1  ref PRIMARY PRIMARY 8   fbads.t2.adgroup_id 358 Using index

1 个答案:

答案 0 :(得分:0)

这看起来像是一个全表扫描,随着快速增长,小的性能变化从长远来看不会产生很大的影响。你需要一种不同的方法。

我会使用cron作业计算前几个月(天等)的聚合,当您需要统计数据时,然后将其与新结果合并(使用您已编写的查询)。这就是为什么你只需要扫描新记录,这意味着查询会很快。

或者,您可以在广告组表格中保留最新的计数器,并在每次点击时更新它们。不确定mysql是否是正确的工具,我可以推荐MongoDB,它可以在字段上进行非常快速的原子增量,虽然它不会像关系数据库那样提供严格保证(ACID),在这种情况下它不是一个问题,广告点击不是关键任务数据,没有人会抱怨,如果你输了&lt;点击信息的0.01%。