2017-06-18 55 views
0

我有一個stats表,其中記錄了每日流量並插入了約500,000條每日記錄。此表的 結構是這樣從單個選擇中插入MySQL多個

id | ip | url | date | country | referrer | type | rate | category |.... 

此表的規模不斷增加,我想保持它的寫操作只

我需要在這個表中的數據,結果存儲在其他表執行分析進行報告。

我打算存儲數據如下..

stats_by_date將不得不日期分組日常統計。

stats_by_country將有按國家分組的每日統計。

stats_by_type將具有按類型分組的日常統計信息。

stats_by_category將具有按類別分組的日常統計信息。

這樣,而不是500,000行只有1行將在那裏每天除了國家表,其中250行將在那裏每天。

我需要每隔半小時從主表插入這些表中的數據。 我知道我可以像

INSERT INTO `stats_by_date` (id, ip, date, rate, type) 
(
SELECT id, COUNT(ip), date, rate, type FROM `stats` 
WHERE date=today 
GROUP BY date 
); 

INSERT INTO `stats_by_type` (id, ip, date, rate, type) 
(
SELECT id, COUNT(ip), date, rate, type FROM `stats` 
WHERE date=today 
GROUP BY type 
); 

與多個查詢插入數據以這種方式將有至少4個INSERT查詢將從主表中讀取同樣的數據和插入基於GROUP BY

我想只從主表讀取一次並插入所有其他表中。 據我所知,爲了實現這一目標,我知道我必須製作TEMPORARY TABLE,其中我必須存儲主表中的數據,然後從此TEMPORARY TABLE我可以執行多個INSERT

我想知道有沒有其他有效的方法可以做到這一點,可以在一個單獨的SELECT中做些什麼?

請參閱並提示。

回答

0

每天500,000行是可觀的數據量。這個過程通常使用主表上的觸發器來處理 - 觸發器會插入新數據。

您的date列表明您有批量上傳過程。 如果是這樣,您可以在完成上載後將行添加到彙總表中。這比使用觸發器更簡單,它將在彙總表上進行大量更新。

+0

統計表(主)中的數據是每日訪問網頁,我沒有批量上傳過程,但我將使用基於時間的觸發器將數據插入彙總表。 –

+0

@TallboY。 。 。基於時間的*事件*比每個插入的觸發器更好。 –

+0

所以沒有辦法在單個'SELECT'中做這些'INSERTS'有些怎麼樣?可能嗎? –