簡體   English   中英

優化INSERT,包含大量數據

[英]Optimization INSERT with huge amount of data

我在一個簡單的java控制台應用程序中使用PreparedStatement來從InputStream加載大量數據。

這是代碼:

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 Load data infile . . . . . Load data infile . . . . . 命令很快。

嘗試在statement.executeBatch()之后進行調試; 而不僅僅是在最后。 這應該允許在您繼續時刷新插入,因為mysql在您的插入上保持標簽,以便它可以在必要時將它們全部回滾。

嘗試以多個批次而不是單個批次添加數據。 每批后提交並跟蹤已處理的數據。 或者您可以使用臨時表將數據添加到表中,一旦完成,重命名表,以防出現故障,重新啟動或從保存點開始。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM