我正在一家广告公司实习,我已经实施了一个工具,从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
答案 0 :(得分:0)
这看起来像是一个全表扫描,随着快速增长,小的性能变化从长远来看不会产生很大的影响。你需要一种不同的方法。
我会使用cron作业计算前几个月(天等)的聚合,当您需要统计数据时,然后将其与新结果合并(使用您已编写的查询)。这就是为什么你只需要扫描新记录,这意味着查询会很快。
或者,您可以在广告组表格中保留最新的计数器,并在每次点击时更新它们。不确定mysql是否是正确的工具,我可以推荐MongoDB,它可以在字段上进行非常快速的原子增量,虽然它不会像关系数据库那样提供严格保证(ACID),在这种情况下它不是一个问题,广告点击不是关键任务数据,没有人会抱怨,如果你输了&lt;点击信息的0.01%。