背景
- 上W级别的单表数据,要实现快速插入
使用executeBatch 优化
- 原实现
PreparedStatement cmd = connection
.prepareStatement("insert into test values(?,?)");
for (int i = 0; i < 10000; i++) {
cmd.setInt(1, i);
cmd.setString(2, "test");
cmd.executeUpdate();
}
- 使用executeBatch
PreparedStatement cmd = connection
.prepareStatement("insert into test values(?,?)");
for (int i = 0; i < 10000; i++) {//1万条数据
cmd.setInt(1, i);
cmd.setString(2, "test");
cmd.addBatch();
}
cmd.executeBatch();
- 性能比较:executeBatch 与executeUpdate相比会有5倍左右的性能提升,但是比较 尴尬的是这里出问题的 是C++代码,Mysql提供的Mysql Connector组件Java是支持executeBatch ,但是C++的Connector组件是不支持的,如果想实现批量插入,需要自己进行拼接收SQL语句。
关闭自动提交再优化
- MySQL是默认开启自动提交的,这就表示除非显式地开始一个事务,否则每个查询都被当做一个单独的事务自动执行。
- Mysql的InnoDB存储引擎支持事务处理。InnoDB表引擎下关闭mysql自动事务提交可以大大提高数据插入的效率,这是因为如果需要插入1000条数据,mysql会自动发起(提交)1000次的数据写入请求,如果把autocommit关闭掉,通过程序来控制,只要一次commit就可以搞定,这是会大大提高速率
- C++侧关闭自动提交之后的性能对比,从日志可以看出,比之前性能提升了将近三倍
//关闭自动提交
connection->setAutoCommit(false);
//进行手动提交
connection_->commit();