2012-11-08 170 views
1

我有一個很大的表格,其中包含多個維度的小時統計數據。現在已經足夠大了,我需要開始彙總數據以加快查詢速度。該表看起來像:在MySql中彙總數據的最佳方式是什麼?

customer INT 
campaign INT 
start_time TIMESTAMP 
end_time TIMESTAMP 
time_period ENUM(hour, day, week) 
clicks INT 

我想我可以,例如,插入一行到這裏活動是空的桌子,和點擊價值將是客戶和時間的所有點擊次數的總和期。同樣,我可以將時間段設置爲「日」,這將是當天所有時間的總和。

我敢肯定,這是一個相當普遍的事情,所以我想知道在MySql中實現這一點的最佳方法是什麼?我假定INSERT INTO與SELECT語句結合(就像物化視圖一樣) - 但是,由於新數據不斷添加到此表中,我如何避免重新計算先前計算的聚合數據?

+0

只是使用where子句。就像只有特定時間段的彙總值一樣 – Randy

回答

0

如果您想讓表格變小,那麼在您創建彙總行後,您將刪除詳細的行,對嗎?交易是你的朋友。啓動一個,計算彙總,插入彙總,刪除詳細的行,結束交易。

如果您碰巧在較早的時間段內添加更多行(誰這樣做?),您可以再次運行彙總 - 它會將您以前的彙總條目與您的額外數據合併爲一個新的更強大的彙總條目。

1

我做過類似的東西,這裏是我的問題涉及:

您可以使用round(start_time/86400)*86400「分組依據」部分,以獲得來自同一天的所有條目的摘要。 (一週幾乎是相同的)

的SQL的樣子:

insert into the_table 
(select 
    customer, 
    NULL, 
    round(start_time/86400)*86400, 
    round(start_time/86400)*86400 + 86400, 
    'day', 
    sum(clicks) 
    from the_table 
    where time_period = 'hour' and start_time between <A> and <B> 
    group by customer, round(start_time/86400)*86400) as tbl; 

delete from the_table 
where time_period = 'hour' and start_time between <A> and <B>; 
  1. 如果你要插入來自同一個表總結自己 - 你將使用溫度(這意味着你複製的一部分來自表格的數據放在一邊,而不是放棄 - 對於每筆交易)。所以你必須非常小心由inner select返回的數據的索引和大小。
  2. 當您不斷插入和刪除行時 - 遲早會出現碎片問題。它會使你的速度顯着下降。解決方案是使用分區&不時刪除舊分區。或者你可以運行「優化表」語句,但它會阻止你工作相當長的時間(可能是幾分鐘)。
  3. 爲了避免重複的數據混亂 - 你可能要克隆的表中的每個時間彙集時段(hour_table,day_table,...)
相關問題