2013-07-09 137 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%也是可以接受的。你的方法似乎很有意義,但由於我無法透露的原因,每日統計數據需要在這個怪物中保持在一起。但是,我可以開始實施這樣的事情,同時保持我最初被問到的數據。 –