因此,我在Excel文件中有大約1000萬條記錄需要以特定方式解析出來(我不能只是將其轉換爲CSV並將其插入)並插入到一個mysql數據庫的不同表格。我整晚都只花了幾個小時就完成了。不過,我想進一步減少這一點。任何人有任何技巧或提示可以幫助我?我正在使用Java和JDBC來解析和連接。解析並將1000萬條記錄插入到SQL中
回答
Mysql允許你使用load from a file。也許你應該做的是:讀取10000條記錄並創建一個文件。在開始讀取下一個10000條記錄時,開始並行運行load data infile
。
因此,這應該讓你更接近一個快速的解決方案:
- 進行並行讀取和負載
- 相反indiviual刀片,使用批量數據加載工具
我對一些文件(400k和〜1.3kk與fk相關)做了同樣的處理,並且加載需要數十秒(通過JDBC/JPA使用時從幾十分鐘減少)。 –
如果你可以在'LOAD DATA INFILE'之前通過主鍵對數據進行排序,它也會變得更快。 –
看看使用executeBatch和做1000塊左右的塊。這將有很大幫助。
請確保在插入時禁用外鍵檢查(僅影響InnoDB),但速度非常快。然後當你完成後重新啓用外鍵。
一些JDBC性能提示,請將連接對象的autoCommit設置爲false。但確保在大量插入(每100K或更多)之後進行提交。另外,通過普通Statement對象使用和重用PreparedStatement對象。使用MyISAM引擎此表 -
一個想法......
有一張桌子稱爲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. SQL插入200萬條記錄
- 2. SQL - 插入數百萬條記錄
- 3. 加速MySQL插入選擇進入1000萬條記錄
- 4. 在MySQL中插入100萬條記錄
- 5. 在MySQL中插入5萬條記錄
- 6. 使用LINQ插入1000條記錄
- 7. 將百萬條記錄寫入Excel中
- 8. HSQLDB如何插入100萬條記錄
- 9. 插入100萬條記錄在MySQL
- 10. 在LINQ to SQL中超時插入數百萬條記錄
- 11. Mysql:百萬條記錄,每天1000萬更新表
- 12. 插入萬條記錄,通過選擇在SQL Server中的記錄
- 13. 的Sql將一個記錄插入到多條記錄
- 14. 正在處理的1000萬條記錄的更新/插入後的塊落實
- 15. 插入百萬條記錄到一個文件中
- 16. SQL Server批量複製插入百萬條記錄慢
- 17. 插入數百萬條記錄與重複數據刪除SQL
- 18. 在1000萬行中查找記錄
- 19. 將200萬條記錄插入到salesforce賬戶對象中的最佳方式
- 20. 從csv文件導入到sql server的前1000條記錄
- 21. 如何快速插入450萬條記錄到SQL Server數據庫與C#
- 22. 每天將數百萬條記錄從sql server遷移到oracle
- 23. SQL - 將記錄插入到多個表中,並且Scope_Identity
- 24. 插入1萬條記錄中花費過多時間MYSQL
- 25. 在表格中插入數百萬條記錄
- 26. Mysql更新查詢超過1000萬條記錄
- 27. 插入記錄到在SQL
- 28. 如何使用Hadoop從csv文件讀取1000萬條記錄併爲每條記錄創建pdf
- 29. 用SSIS導入數百萬條記錄
- 30. SQL插入語句插入2條記錄而不是1條
你怎麼能夠把它減少到幾個小時? – gouki
那麼在我的代碼中有很多低效率。比如多次打開和關閉連接,所以我把它剪掉了。我現在只打開一個持久連接。同樣在我的原始代碼中,我首先加載了所有數據,然後一次處理完所有內容。現在我將它加載到3個塊中,並一次處理每個塊,從而在每個塊完成後釋放內存。我還有一些統計數據,我正在計算困難的方式,所以我用一些hashmaps清理了這些數據。可能還有其他的東西,但我現在沒有在我面前的代碼。 –
如果意圖是將來自同一個excel文件的數據插入到不同的表中,我建議編寫自己的腳本來讀取excel文件,併爲各個表生成INSERT語句,然後可以將其作爲批處理導入。或者,您的腳本可能會直接將數據推送到數據庫中。解決方案取決於這個導入是一次性活動還是反覆出現 – Abhay