2013-07-09 80 views
-1

我在广告公司做实习,我已经实施了一个工具来收集所有必要的数据表单facebook并将它们导入到数据库中。从多个表中选择和总和vs加入和总和

现在我试图操纵这些数据,首先做一些测试用例并获得一些结果。这些表格每天增长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

**首先**你需要运行你的连接,并看到它的性能没有任何聚合。你运行EXPLAIN查询了吗?没有解释,不应该接受SQL性能问题。只有当你让你的加入快速 - 那么你可以去聚合 –

回答

0

这看起来像一个全表扫描,并与从长远来看,快速增长的小型业绩变化并不会产生重大影响。你需要一个不同的方法。

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

或者,您可以在adgroups表中保留最新的计数器,并在每次点击时更新它们。不确定mysql是否是适合这个的正确工具,我可以推荐MongoDB,它可以在字段上执行非常快的原子增量,尽管它不会像关系数据库那样给予严格的保证(ACID),但在这种情况下,它不是一个问题,广告点击不是关键任务数据,没有人会抱怨,如果你失去了0.01%的点击信息的百分之零点零一下百分之零点零一下。

+0

是差异呼叫,并会经常发生,这是预期;如果消息来源有所固定,即使是5%也是可以接受的。你的方法似乎很有意义,但由于我无法透露的原因,每日统计数据需要在这个怪物中保持在一起。但是,我可以开始实施这样的事情,同时保持我最初被问到的数据。 –