Mysql使用PreparedStatement的批量插入优化

背景

  • 上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使用PreparedStatement的批量插入优化_第1张图片
  • Mysql的InnoDB存储引擎支持事务处理。InnoDB表引擎下关闭mysql自动事务提交可以大大提高数据插入的效率,这是因为如果需要插入1000条数据,mysql会自动发起(提交)1000次的数据写入请求,如果把autocommit关闭掉,通过程序来控制,只要一次commit就可以搞定,这是会大大提高速率
    Mysql使用PreparedStatement的批量插入优化_第2张图片
  • C++侧关闭自动提交之后的性能对比,从日志可以看出,比之前性能提升了将近三倍
//关闭自动提交
connection->setAutoCommit(false);
//进行手动提交 
connection_->commit(); 

在这里插入图片描述

你可能感兴趣的:(MYSQL)