我创建了一个向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.我将数据库插入数据库的方式是最好的方法吗?
答案 0 :(得分:2)
这是批量插入的有效方法。
Connection connection = new getConnection();
Statement statement = connection.createStatement();
for (String query : queries) {
statement.addBatch(query);
}
statement.executeBatch();
statement.close();
connection.close();
答案 1 :(得分:0)
问题1&amp; 2:
准备好的陈述主要是关于表现的概念是一种误解,虽然它是一种常见的陈述。
另一张海报提到他注意到Oracle和SQL Server的速度提升了大约20%。我注意到与MySQL类似的数字。事实证明,解析查询并不是所涉及工作的重要部分。在一个非常繁忙的数据库系统上,它还不清楚查询解析是否会影响整体吞吐量:总的来说,它可能只是耗尽CPU时间,否则当数据从磁盘返回时它将处于空闲状态
因此,作为使用预准备语句的一个原因,针对SQL注入攻击的保护远远超过了性能改进。如果您不担心SQL注入攻击,您可能应该......
这是原帖:
PreparedStatements and performance
在我看来,所有答案都值得一读。我认为你希望PreparedStatement
成为某种魔术师会大大提高你的插入速度,这就是你对你所获得的改进感到失望的原因。
问题3 :
使用PreparedStatement
的正确方法是准备一个语句,然后设置值并在循环中更新数据库。这是一个很好的例子:Reusing a PreparedStatement multiple times