【问题标题】:Inserting huge data into a database in java在java中将大量数据插入数据库
【发布时间】:2015-11-27 00:20:13
【问题描述】:

这可能会被很多人问到,但是, 所以我正在尝试使用 java 将 400 万条记录插入数据库, 我做了很多谷歌搜索并尝试了访问和 MySQL。两者几乎一样, 使用 MySQL 我尝试了statement.addBatch();,但仍然需要很长时间。 问题是,我能得到的最佳时间是什么时候?最好的方法是什么?

        counter++;
        String sqlQuery = "INSERT INTO employees VALUES("some query")";

        sqlState.addBatch(sqlQuery);

        if (counter == 1000) {

            sqlState.executeBatch();

            counter = 0;
        }

我也使用 Batch 对吗?

【问题讨论】:

  • 如果您知道数据是一致的,您可能可以在插入之前删除所有约束并在完成后添加它们。这应该会极大地提高性能。
  • 目前的记录是如何存储的?它们在 SQL 文件中吗?如果是这样,您应该能够直接将其作为脚本运行,而无需使用 Java。只是一个想法。
  • 这听起来像是数据的初始加载。您可能想绕过 Java 直接插入。对于 MySQL,这将使用LOAD DATA。正如@ReutSharabani 所说,在加载期间删除所有索引和外键将有很大帮助。重建包含 400 万条记录的索引比一次插入一条记录要快得多。
  • @ReutSharabani 我没有关注你,我是新手

标签: java mysql jdbc


【解决方案1】:

重复使用单个 PreparedStatements,并为每条记录设置参数,然后将其添加到批处理中。

PreparedStatement ps = conn.prepareStatement("Insert into employees (f1, f2, f3) VALUES (?, ?, ?)");
while (hasMoreRecords) {
  ps.setString(1, "v1");
  ps.setString(2, "v2");
  ....
  ps.addBatch();
  if (++i % 1000 == 0) {
    ps.executeBatch();
  }
}
ps.executeBatch();

这不会有很大的不同,但却是最佳的。

您的INSERT 是否使用子查询?也许那个子查询很慢。

【讨论】:

  • 我会试试这个。不,没有子查询
猜你喜欢
  • 2011-09-21
  • 1970-01-01
  • 2012-10-06
  • 2021-03-31
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多