2013-05-27 104 views
1

所以基本上我有一堆1千兆數據文件(壓縮),只是包含帶時間戳和其他內容的JSON數據的文本文件。大數據:處理SQL插入/更新或逐行合併或逐行合併?

我將使用PHP代碼將這些數據插入MYSQL數據庫。

我將無法將這些文本文件存儲在內存中!因此,我必須逐行處理每個數據文件。爲此,我正在使用stream_get_line()。

  • 一些包含的數據將被更新,一些將被插入。

問題 難道是更快地使用插入/選擇/更新語句,或創建一個CSV文件,導入這樣的說法?

創建一個文件,這是批量操作,然後從SQL執行它?

我需要基本上插入數據與主鍵不存在,並更新數據上的字段,如果主鍵確實存在。但我會在大量的數量上做這個。

表現永遠是問題。

更新 該表有22000列,只能說他們的10-20不包含0

+0

你有沒有想過使用'LOAD DATA INFILE'來代替?如果格式正確,它可以直接將CSV讀取到數據庫中。 – tadman

+0

正在考慮使用LOAD DATA INFILE,唯一的問題是一些數據將被合併,而其他數據將被插入。@tadman –

回答

0

我將所有的數據加載到一個臨時表,並讓MySQL的做繁重。

  1. create table temp_table as select * from live_table where 1=0;

  2. 讀取該文件,並創建一個數據產品,是用於裝載與load data infile兼容創建臨時表。

  3. 數據加載到臨時表,並通過執行現場表和臨時表之間的內部查詢添加索引主鍵

  4. 下一頁孤立你更新。通過並做你的更新。

  5. 從臨時表中刪除所有更新(再次使用它與活動表之間的內部聯接)。

  6. 用簡單的插入方式將所有插入處理成live_table作爲select * from temp_table。

  7. 放下臨時桌子,回家喝杯冷飲。

這可能是過度簡化爲您的用例,但略作調整它應該工作一種享受。

+0

目前我正在考慮這樣做,只會勉強寫出查詢,主表有22,000列,其中大部分爲零。有沒有辦法只導入非零並將它們與主表合併? –

+0

@JacobSteele如果可能的話,你真的應該設計你的模式,因爲22,000列是一個非常糟糕的主意。如果使用一個關聯表,並且你有一個與特定行關聯的〜10-20個值? – tadman