mysql 批量插入 方法

1000次插入方法的比较。

方法1:
Java code
   
   
conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASS); pstmt = conn.prepareStatement( " insert into loadtest (id, data) values (?, ?) " ); for ( int i = 1 ; i <= COUNT; i ++ ) { pstmt.clearParameters(); pstmt.setInt( 1 , i); pstmt.setString( 2 , DATA); pstmt.execute(); }

MyISAM:246.6秒、InnoDB:360.2秒

方法2: 使用事务,不自动commit
Java code
   
   
conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASS); conn.setAutoCommit( false ); pstmt = conn.prepareStatement( " insert into loadtest (id, data) values (?, ?) " ); for ( int i = 1 ; i <= COUNT; i ++ ) { pstmt.clearParameters(); pstmt.setInt( 1 , i); pstmt.setString( 2 , DATA); pstmt.execute(); if (i % COMMIT_SIZE == 0 ) { conn.commit(); } } conn.commit();

InnoDB:31.5秒

方法3: executeBatch
Java code
   
   
conn = DriverManager.getConnection(JDBC_URL + " ?rewriteBatchedStatements=true " , JDBC_USER, JDBC_PASS); conn.setAutoCommit( false ); pstmt = conn.prepareStatement( " insert into loadtest (id, data) values (?, ?) " ); for ( int i = 1 ; i <= COUNT; i += BATCH_SIZE) { pstmt.clearBatch(); for ( int j = 0 ; j < BATCH_SIZE; j ++ ) { pstmt.setInt( 1 , i + j); pstmt.setString( 2 , DATA); pstmt.addBatch(); } pstmt.executeBatch(); if ((i + BATCH_SIZE - 1 ) % COMMIT_SIZE == 0 ) { conn.commit(); } } conn.commit();

InnoDB:5.2秒

上面的使用时必须
1)rewriteBatchedStatements=true
2)useServerPrepStmts=true

方法4:先LOAD再COMMIT
Java code
   
   
conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASS); conn.setAutoCommit( false ); pstmt = conn.prepareStatement( " load data local infile '' " + " into table loadtest fields terminated by ',' " ); StringBuilder sb = new StringBuilder(); for ( int i = 1 ; i <= COUNT; i ++ ) { sb.append(i + " , " + DATA + " \n " ); if (i % COMMIT_SIZE == 0 ) { InputStream is = new ByteArrayInputStream(sb.toString().getBytes()); ((com.mysql.jdbc.Statement) pstmt).setLocalInfileInputStream(is); pstmt.execute(); conn.commit(); sb.setLength( 0 ); } } InputStream is = new ByteArrayInputStream(sb.toString().getBytes()); ((com.mysql.jdbc.Statement) pstmt).setLocalInfileInputStream(is); pstmt.execute(); conn.commit();

这个最快4.6秒
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值