2012-05-17 102 views
0
連接

在使用InnoDB和外鍵MySQL數據庫...快速加載數據到文件分割到表按編號

我需要從一個巨大的CSV文件導入數據的100MiB並分成兩個表和記錄必須像如下

 
Table1 
id|data|data2 

Table2 
id|table1_id|data3 

Table2.table1_id是一個外鍵引用Table1.id

的一個實例MySQL的順序應該是這樣的

  1. 加載文件到一個臨時表
  2. 之後執行插入從臨時表到所需要的
  3. 獲得最後插入ID
  4. 使用此參考ID做最後一個插入組...

這是完全緩慢的...

如何使用文件加載到...?任何真正的想法高速結果?

+0

2步 - 4。步驟當然是在一個循環:) 並供參考 - 8000 rec /秒是SLOW ...需要至少20 000 rec rec/sec – user663184

回答

0

你可以臨時添加列data3Table1(我還添加了一個done列區分從CSV從那些已經存在/從其他地方起源起源記錄):

ALTER TABLE Table1 
    ADD COLUMN data3 TEXT, 
    ADD COLUMN done BOOLEAN DEFAULT TRUE; 

LOAD DATA 
    INFILE '/path/to/csv' 
    INTO TABLE Table1 (data, data2, data3) 
    SET done = FALSE; 

INSERT 
    INTO Table2 (table1_id, data3) 
    SELECT (id, data3) FROM Table1 WHERE NOT done; 

ALTER TABLE Table1 
    DROP COLUMN data3, 
    DROP COLUMN done; 
+0

偉大的思想想象一樣,大聲笑 – GDP

+0

對不起,但這遠非解決方案。從邏輯上講,表格的結構不能定期更改......這是一個隨時都會被調用的過程se一個這樣的文件的負載將每天上傳......表格的結構被設置並且解決方案必須處理...這僅僅是結構的簡單例子,真實結構將需要A4頁面只是複製創建代碼...所以當我有2個不同的表必須通過外鍵鏈接時,有什麼真正的想法如何使用文件函數中的加載數據?我認爲我明確表示...對不起 – user663184

+0

@ user663184:我認爲表的結構不能(暫時)改變,因爲可能有併發的'SELECT * FROM Table1'或'INSERT INTO TABLE1 VALUES ...'查詢這可能會導致客戶端應用程序內的問題,如果意外有兩個額外的列?爲了避免這些問題,你可以通過一個臨時表(但是如果可能有來自別處的併發'INSERT'語句,你需要在'LOAD'和'INSERT ... SELECT'期間鎖定'Table1' - in這種情況下,你可能只是鎖定'Table1',同時按照最初的建議進行上面的操作......) – eggyal