如何更快地插入记录
How to insert records faster
我必须从 CSV 文件中读取记录并将它们存储在 Mysql 数据库中。
我知道 "LOAD DATA INFILE" 但在我的情况下,我必须从文件中获取单个记录,检查它是否有效 format/length 等,然后将其存储在数据库中。
// 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);
}
}
以及在数据库中插入记录的方法:taken from here
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();
}
}
这是可行的,但是插入记录的速度非常慢。
有什么方法可以更快地插入记录吗?
我认为更好的方法是使用定义的规则处理 csv 文件,然后创建另一个 csv,一旦准备好输出 csv。将数据加载到文件中。
会很快的。
如果您想通过自己的应用程序插入,请像这样创建批查询并执行到 MySQL 服务器。
String query = "INSERT INTO mytable(numbers)
VALUES (0),
(1),
(2),
(3)";
您需要使用:“rewriteBatchedStatement
”,因为这是一个 MYSQL 优化 ,它试图通过整合在尽可能少的数据包中插入或更新。
此外,该文章中还有其他优化。希望这可以加快批处理速度。
编辑 1:
本站对此参数也有清晰的解释:参考:MySQL and JDBC with rewriteBatchedStatements=true
@Khanna111 的回答很好。
我不知道是否有帮助,但请尝试检查 table 引擎类型。我曾经遇到过记录插入很慢的问题。我将引擎从 InnoDB 更改为 MyISAM,插入变得非常快。
我必须从 CSV 文件中读取记录并将它们存储在 Mysql 数据库中。
我知道 "LOAD DATA INFILE" 但在我的情况下,我必须从文件中获取单个记录,检查它是否有效 format/length 等,然后将其存储在数据库中。
// 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);
}
}
以及在数据库中插入记录的方法:taken from here
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();
}
}
这是可行的,但是插入记录的速度非常慢。 有什么方法可以更快地插入记录吗?
我认为更好的方法是使用定义的规则处理 csv 文件,然后创建另一个 csv,一旦准备好输出 csv。将数据加载到文件中。
会很快的。
如果您想通过自己的应用程序插入,请像这样创建批查询并执行到 MySQL 服务器。
String query = "INSERT INTO mytable(numbers)
VALUES (0),
(1),
(2),
(3)";
您需要使用:“rewriteBatchedStatement
”,因为这是一个 MYSQL 优化 ,它试图通过整合在尽可能少的数据包中插入或更新。
此外,该文章中还有其他优化。希望这可以加快批处理速度。
编辑 1: 本站对此参数也有清晰的解释:参考:MySQL and JDBC with rewriteBatchedStatements=true
@Khanna111 的回答很好。
我不知道是否有帮助,但请尝试检查 table 引擎类型。我曾经遇到过记录插入很慢的问题。我将引擎从 InnoDB 更改为 MyISAM,插入变得非常快。