1

我创建了一个向 MySql 数据库插入数百万个值的程序。我读到了批量插入,它将优化我的程序并使其更快,但是当我尝试这样做时,它以相同的方式工作。我没有将每个值插入数据库,而是每次将 500 个值保存在一个列表中,然后将它们插入一个大循环中,如下所示:

for(int i=0;i<500;i++)
{
   insertData(list.get(i));
}

然后我删除列表中的所有值并再次开始收集 500 个值。它不应该更好地工作吗?
我的插入代码是:

public void insertToNameTable(String id,String name) throws SQLException
       {
           PreparedStatement ps=null;

            ps= conn.prepareStatement("INSERT INTO NameTable values(?,?,?)",user.getId(),user.getName());


            ps.setString(1,id);
            ps.setString(2,name);
            ps.setBoolean(3,false);
            ps.executeUpdate();

       }

我有一些问题:
1.为什么当我进行批量插入时它不能更快​​地工作?
2.每次我应该输入多少个值才能让它更快?(500,1000,10000)一起输入的值越多越好?
3.我将值插入数据库的方式是最好的方式吗?

4

2 回答 2

2

这是批量插入的有效方式。

Connection connection = new getConnection();
Statement statement = connection.createStatement();
 
for (String query : queries) {
    statement.addBatch(query);
}
statement.executeBatch();
statement.close();
connection.close();

于 2014-12-18T09:23:00.400 回答
0

问题1&2:

用户 Neil Coffey 前段时间说:

准备好的语句主要是关于性能的概念是一种误解,尽管它很常见。

另一位发帖人提到,他注意到 Oracle 和 SQL Server 的速度提高了约 20%。我注意到 MySQL 有一个类似的数字。事实证明,解析查询并不是所涉及工作的重要部分。在一个非常繁忙的数据库系统上,查询解析是否会影响整体吞吐量也不清楚:总体而言,它可能只是用尽了 CPU 时间,否则在数据从磁盘返回时会处于空闲状态。

因此,作为使用准备好的语句的一个原因,对 SQL 注入攻击的保护远远超过了性能改进。如果您不担心 SQL 注入攻击,您可能应该...

这是原始帖子:
PreparedStatements and performance
,在我看来,所有答案都值得一读。我认为您希望PreparedStatement成为某种能显着提高插入速度的魔术师,这就是为什么您对所获得的改进感到失望的原因。

问题3
正确的使用方法PreparedStatement是准备一个语句,然后在循环中设置值和更新数据库。这是一个很好的例子:Reusing a PreparedStatement multiple times

于 2014-12-18T09:40:28.640 回答