gpt4 book ai didi

java - 海量数据优化INSERT

转载 作者:可可西里 更新时间:2023-11-01 08:48:36 25 4
gpt4 key购买 nike

我在一个简单的 Java 控制台应用程序中使用 PreparedStatementInputStream 加载大量数据。

这是代码:

public void readStopTimes(CSVReader reader) throws IOException, SQLException {
String insertSql = "INSERT INTO stop_times VALUES (null, ?, ?, ?, ?, ?)";
PreparedStatement statement = db.prepareStatement(insertSql);
String [] nextLine;
long i = 0;
Chronometer chronometer = new Chronometer();
while ((nextLine = reader.readNext()) != null) {
if(i++ != 0) {
statement.setString(1, nextLine[0]);
if(nextLine[1].isEmpty())
statement.setNull(2, Types.TIME);
else
statement.setTime(2, Time.valueOf(nextLine[1]));
if(nextLine[2].isEmpty())
statement.setNull(3, Types.TIME);
else
statement.setTime(3, Time.valueOf(nextLine[2]));
statement.setString(4, nextLine[3]);
statement.setInt(5, Integer.parseInt(nextLine[4]));
statement.addBatch();
}
if(i++ % 1000 == 0) {
statement.executeBatch();
}
if(chronometer.count() > 5000) {
chronometer.restart();
log.debug("Analyzed {} rows", i);
}
}
statement.executeBatch();
db.commit();
}

每 1000 次插入我执行批处理,每 5 秒我打印一个日志。

从日志中可以看出,该算法在开始时运行速度非常快,在前 25 秒内总共计算了超过 400 万行,然后速度变慢,在 5 秒内仅添加了 2 行到批处理。

我需要插入超过 500 万行,您有更快的选择吗?

最佳答案

  • 在 mysql 中禁用查询缓存
  • innodb_flush_log_at_trx_commit = 2 或者如果你能确保你的 mysql 不会崩溃而不是让它 innodb_flush_log_at_trx_commit = 0
  • 如果启用复制,则通过执行 sync_binlog = 0
  • 禁用 bin 日志同步

您可以尝试通过 Load data infile 将 CSV 文件直接放入 MySql。 . . . . 命令非常快。

关于java - 海量数据优化INSERT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20552009/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com