高效的多SQL插入

时间:2010-08-08 18:13:42

标签: java sql insert performance

将1000行插入一个表(jdbc / connector-mysql数据库)的最佳/最有效时间是什么? (它是一个缓冲区,每次填满时都需要转储到数据库中)

1-一个自动生成/同步的SQL语句?

2- for (int i = 0; i<1000; i++) { con.prepareStatement(s.get(i)); } con.commit();

3-存储过程?

通过文件插入大量数据?

5-(你的解决方案)

3 个答案:

答案 0 :(得分:2)

The LOAD DATA INFILE statement可能是您表现最好的选择。 (上面的选项列表中的#4)虽然可能需要更多代码来完成您的任务,因为您需要创建中间文件,将其送到服务器然后调用LOAD DATA将其放入数据库。

MySql帮助页引用:

  

LOAD DATA INFILE语句读取   从文本文件到表中的行   速度非常快。

答案 1 :(得分:0)

您可以使用JDBC批量插入。

PreparedStatement ps = cn.prepareStatement("INSERT INTO....");

for (int i = 0; i < 1000; i++) {
    ps.setString(1, "value-" + i); // Set values
    ps.addBatch();                 // Add this to the batch
    ps.clearParameters();          // Reset the parameters
}

ps.executeBatch();

然而,MySQL本身不支持批量插入功能,因此为了获得合理的性能,您需要将rewriteBatchedStatements=true添加到mysql jdbc配置中。

如果要创建大型SQL字符串,还可以使用MySQL特定的批处理插入语法。我会尝试两种方法并测试性能。

INSERT INTO x (a,b)
     VALUES ('1', 'one'),
            ('2', 'two'),
            ('3', 'three');

请注意这两种方法,因为您可能会超过单个请求的最大数据包大小。您可能需要设置与缓冲区中的条目数不同的批处理大小。例如。您可能需要在10个批次中分割1000个条目。

答案 2 :(得分:0)

请注意,JDBC会在每个语句后自动提交,除非您明确告诉它不要。这样做并在运行commit之前运行X插入,应该会提高你的性能。