2012-08-08 33 views
2

我需要解決一個缺少主鍵的問題,我想獲得一些想法 最好的辦法做到這一點。聚合行和創建主鍵

我們有一個關於幾個生產數據庫的程序,我們將每個 小時的新數據插入到一個總和表中。五列是關鍵,其他列是 值是不同的總和。我們使用ON DUPLICATE KEY UPDATE在每個插入處添加 總和。插入語句看起來像這樣:

INSERT INTO sums (key1,key2,key3,key4,key5,sum1,sum2) VALUES (..., 13, 42, 3) 
ON DUPLICATE KEY UPDATE sum1=VALUES(sum1)+sum1,sum2=VALUES(sum2)+sum2 

事情是當表創建主鍵沒有設置(不是我的錯:)。 現在我需要聚合具有相同鍵的行,然後添加 主鍵。由於缺少主鍵,表在幾個系統上已增長到約 700 000 000行,所以我需要一些有效的方法來完成此操作。

我想這樣做,而不必推遲每 小時添加新行。因爲在現在系統工作的方式現在節省了插入,並且以後需要很多工作。

我做的每一個操作都不能鎖定表格45分鐘左右。 我希望創建實際主鍵的時間要短於如果我管理 先合併某些行。也許這是更快的創建一個索引 鍵列首先,所以我有一個索引用於聚合行操作?

我不確定聚合行的最佳方式是什麼。任何好的 建議將不勝感激。

+2

按鍵1到5的任何一個按時間順序排列?這樣您可以識別在某個時間點之後添加的行嗎?在這種情況下,我會以塊的形式運行聚合查詢 - 首先是第一百萬行,然後是第二行等 - 然後將聚合結果複製到新表中。這可能足夠快,以便您不要將表格鎖定時間過長,並且您可以在不到45分鐘的時間內切換到最後一次運行後的新表格。 – 2012-08-08 12:39:24

+0

是的,其中一個關鍵列是基於日期的。我想對於實際的合併,我需要通過大塊來完成。也許最好的開始方式是爲基於日期的列添加索引,並查看需要多長時間。我猜想建立一個索引的速度比同時使用所有鍵的索引要快一些。 – ygram 2012-08-08 12:44:59

回答

1

首先,重命名現有的資金錶sums_old並創建新的,正確的資金錶,所以你可以保持您小時的過程去。但是,要意識到,除非您應用匯總數據,否則彙總表中的數據將不正確。

現在,應用下面的查詢來更新表:

INSERT INTO sums (key1, key2, key3, key4, key5, sum1, sum2) 
SELECT key1, key2, key3, key4, key5, sum1, sum2 FROM sums_old 
ON DUPLICATE KEY UPDATE sum1 = VALUES(sum1) + sum1, sum2 = VALUES(sum2) + sum2 

別急,因爲你正在使用MyISAM數據,並且不希望臺鎖定過長,做到在與LIMIT塊:

INSERT INTO sums (key1, key2, key3, key4, key5, sum1, sum2) 
SELECT key1, key2, key3, key4, key5, sum1, sum2 FROM sums_old 
ORDER BY some_index 
LIMIT 0, 250000 
ON DUPLICATE KEY UPDATE sum1 = VALUES(sum1) + sum1, sum2 = VALUES(sum2) + sum2 

INSERT INTO sums (key1, key2, key3, key4, key5, sum1, sum2) 
SELECT key1, key2, key3, key4, key5, sum1, sum2 FROM sums_old 
ORDER BY some_index 
LIMIT 250000, 250000 
ON DUPLICATE KEY UPDATE sum1 = VALUES(sum1) + sum1, sum2 = VALUES(sum2) + sum2 

INSERT INTO sums (key1, key2, key3, key4, key5, sum1, sum2) 
SELECT key1, key2, key3, key4, key5, sum1, sum2 FROM sums_old 
ORDER BY some_index 
LIMIT 500000, 250000 
ON DUPLICATE KEY UPDATE sum1 = VALUES(sum1) + sum1, sum2 = VALUES(sum2) + sum2 

... 

您需要在一些關鍵的命令去做的塊,所以如果你沒有一個,您需要將其添加到sums_old表。

找出一個好的塊大小是多少。

+0

要創建一個新表並讓小時過程插入該表中,這是一個非常好的主意。我只需要說服一些客戶說,獲取不正確數據一段時間比獲取數據要好(因爲每個查詢都是全表掃描,所以現在發生了什麼)。 – ygram 2012-08-08 14:07:28

0

我要說嘗試這樣的東西agregate他們

select key1,key2,key3,k4,key5, 
convert(key1 as varchar) + convert(key2 as varchar) + convert(key3 as varchar) + convert(k4 as varchar) + convert(key5 as varchar) as Pk 
from sums 
group by key1,key2,key3,k4,key5 
having distinct(convert(key1 as varchar) + convert(key2 as varchar) + convert(key3 as varchar) + convert(k4 as varchar) + convert(key5 as varchar)) 

我不羨慕你,700M的配發,操作就像你想做的事應該採取配發的時候,我覺得一個。

希望這有助於

乾杯