[英]How to insert records faster
我必須從CSV文件中讀取記錄並將其存儲在Mysql數據庫中。
我知道“ LOAD DATA INFILE”,但就我而言,我必須從文件中獲取單個記錄,檢查它是否為有效格式/長度等,然后將其存儲在數據庫中。
// list to store records from CSV file
ArrayList<String> list = new ArrayList<String>();
//Read one line at a time
while ((nextLine = reader.readNext()) != null)
{
for (String number : nextLine)
{
if (number.length() > 12 && number.startsWith("88"))
{
list.add(number);
} else if (number.length() > 9 && number.startsWith("54"))
{
list.add(number);
}
else if (number.length() > 8 && number.startsWith("99"))
{
list.add(number);
}
else
{
// ....
}
// method to insert data in database
insertInToDatabase(list);
}
}
和在db中插入記錄的方法: 取自此處
private void insertInToDatabase(ArrayList<String> list)
{
try
{
String query = "INSERT INTO mytable(numbers) VALUES(?)";
prepStm = conn.prepareStatement(query);
for (String test : list)
{
prepStm.setString(1, test);
prepStm.addBatch();// add to batch
prepStm.clearParameters();
}
prepStm.executeBatch();
}
}
這是可行的,但是記錄的插入速度非常慢。 有什么方法可以更快地插入記錄。
您將需要使用:“ rewriteBatchedStatement
”,因為這是MYSQL 優化 ,它試圖通過將插入或更新合並到盡可能少的數據包中來減少到服務器的往返行程。
請參考: https : //anonymousbi.wordpress.com/2014/02/11/increase-mysql-output-to-80k-rowssecond-in-pentaho-data-integration/
此外,該文章中還有其他優化 。 希望這樣可以加快批處理速度。
編輯1:在此站點上也對此參數有一個清晰的解釋:參見: MySQL和JDBC,帶有rewriteBatchedStatements = true
我認為更好的方法是使用定義的規則處理csv文件,然后再創建另一個csv,一旦准備輸出csv。 加載文件中的數據。
很快。
如果要通過自己的應用程序進行插入,請創建像這樣的批處理查詢並執行到MySQL服務器。
String query = "INSERT INTO mytable(numbers)
VALUES (0),
(1),
(2),
(3)";
@ Khanna111的答案很好。
我不知道是否有幫助,但是請嘗試檢查表引擎類型。 我曾經遇到過記錄插入速度非常慢的問題。 我將引擎從InnoDB更改為MyISAM,插入變得非常快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.