2011-06-23 112 views
2

因此,我在Excel文件中有大約1000萬條記錄需要以特定方式解析出來(我不能只是將其轉換爲CSV並將其插入)並插入到一個mysql數據庫的不同表格。我整晚都只花了幾個小時就完成了。不過,我想進一步減少這一點。任何人有任何技巧或提示可以幫助我?我正在使用Java和JDBC來解析和連接。解析並將1000萬條記錄插入到SQL中

+0

你怎麼能夠把它減少到幾個小時? – gouki

+0

那麼在我的代碼中有很多低效率。比如多次打開和關閉連接,所以我把它剪掉了。我現在只打開一個持久連接。同樣在我的原始代碼中,我首先加載了所有數據,然後一次處理完所有內容。現在我將它加載到3個塊中,並一次處理每個塊,從而在每個塊完成後釋放內存。我還有一些統計數據,我正在計算困難的方式,所以我用一些hashmaps清理了這些數據。可能還有其他的東西,但我現在沒有在我面前的代碼。 –

+0

如果意圖是將來自同一個excel文件的數據插入到不同的表中,我建議編寫自己的腳本來讀取excel文件,併爲各個表生成INSERT語句,然後可以將其作爲批處理導入。或者,您的腳本可能會直接將數據推送到數據庫中。解決方案取決於這個導入是一次性活動還是反覆出現 – Abhay

回答

5

Mysql允許你使用load from a file。也許你應該做的是:讀取10000條記錄並創建一個文件。在開始讀取下一個10000條記錄時,開始並行運行load data infile

因此,這應該讓你更接近一個快速的解決方案:

  1. 進行並行讀取和負載
  2. 相反indiviual刀片,使用批量數據加載工具
+0

我對一些文件(400k和〜1.3kk與fk相關)做了同樣的處理,並且加載需要數十秒(通過JDBC/JPA使用時從幾十分鐘減少)。 –

+0

如果你可以在'LOAD DATA INFILE'之前通過主鍵對數據進行排序,它也會變得更快。 –

3

看看使用executeBatch和做1000塊左右的塊。這將有很大幫助。

1

請確保在插入時禁用外鍵檢查(僅影響InnoDB),但速度非常快。然後當你完成後重新啓用外鍵。

1

一些JDBC性能提示,請將連接對象的autoCommit設置爲false。但確保在大量插入(每100K或更多)之後進行提交。另外,通過普通Statement對象使用和重用PreparedStatement對象。使用MyISAM引擎此表 -

2

一個想法......

有一張桌子稱爲excel_staging您的Excel文件的結構相匹配在MySQL中建立一個臨時的(臨時)數據庫。

使用加載數據infile將excel文件(保存爲csv)加載到excel_staging表格中 - 不應超過幾分鐘來填充,特別是它是myisam。

truncate table excel_staging; 

load data infile 'excel_staging.csv' 
into table excel_staging 
fields terminated by... 
lines terminated by.. 
(
field1, 
field2, 
... 
); 

編寫大量的SELECT INTO從excel_staging表中提取的數據轉換成將用於加載到您的個人InnoDB的生產數據庫表單獨CSV文件OUTFILE語句。如果有必要的話,您可以真正具有創造性 - 您甚至可能需要加載額外的數據來支持連接等,以便生成格式良好的csv輸出。

select distinct cust_id, name into outfile 'customers.csv' 
fields termniated by... 
lines terminated by... 
from 
excel_staging 
order by 
cust_id; -- order for innodb import 

select distinct dept_id, name into outfile 'departments.csv' 
fields termniated by... 
lines terminated by... 
from 
excel_staging 
order by 
dept_id; 

裝入很好地格式化,清洗,並通過主鍵CSV文件orderd到使用LOAD DATA INFILE您的生產InnoDB表...

load data infile 'customers.csv' 
into table customers 
fields terminated by... 
lines terminated by.. 
(
cust_id, 
name 
); 

... 

剔除該解決方案代碼的時間(30分鐘說)應該能夠加載到分期中,輸出到csv中,並在大約6分鐘的時間內加載到生產表中。

希望這會有所幫助。

+1

我喜歡這個想法,我可能會嘗試。 –