【发布时间】:2016-04-21 23:36:11
【问题描述】:
通过 Java 代码将大约 500.000 条记录从 CSV 文件插入 MySQL 数据库需要多长时间?托管在本地主机上的数据库。
表结构:AI id, | varchar(8) | datetime | int | varchar(2)。我的代码需要在 40 分钟内插入 70.000 条记录。有什么方法可以更快地做到这一点吗?
这是我的代码的主要部分:
CsvReader pro
ducts = new CsvReader(path);
products.readHeaders();
stmt = con.createStatement();
String updateString = "INSERT INTO table (T_V1, date, T_V2, T_V3) VALUES (?,?,?,?)";
PreparedStatement preparedStatement = con.prepareStatement(updateString);
while (products.readRecord()) {
v1= products.get("V1");
date = format.parse(products.get("Date") + " " + products.get("Hour"));
java.sql.Date dateDB = new java.sql.Date(data.getTime());
v2 = products.get("V2");
v3 = products.get("V3");
preparedStatement.setString(1, v1);
preparedStatement.setDate(2,dateDB);
preparedStatement.setInt(3, Integer.parseInt(v2));
preparedStatement.setString(4, v3);
preparedStatement.executeUpdate();
}
根据您的建议,我将语句的创建移出循环。在我有 29 rps 之后,现在我每秒有 33 条记录。
【问题讨论】:
-
将语句的创建移出while循环
-
你不应该使用Java导入数据,使用mysqlimport实用程序。
-
曾经我不得不将基于
pcap文件的数百万条记录插入数据库。将数据分成块并使用线程运行它要快得多。不知道它在 MySQL 中是如何工作的。我使用 Oracle DB,并让生产者线程创建表类型(代表一组数据库记录),让消费者线程创建数据库事务并使用这些表类型参数调用存储过程,将数据插入数据库。但一般来说,如果你已经有 CSV 文件,最快的方法是使用一些 SQL Loader 替代品dev.mysql.com/doc/refman/5.1/en/load-data.html -
按照建议,在循环外仅创建一次
PreparedStatement,此外,请考虑按照 this post 中的建议使用批量插入 (preparedStatement.addBatch())。 -
我将语句的创建移出循环。不幸的是,我不得不用 Java 来做这件事