mysql数据库批量快速插入_MySQL

WBOY
發布: 2016-06-01 12:58:49
原創
1034 人瀏覽過

最近在处理一批数据,需要从库中表里的字段进行处理然后导出到一个新表中。不过这个表的数据量有近500w条。这数据量出现的的问题是需要处理的时间好长。
首先想到,一句一句的插入,大数据量处理时间好长,忽略。
其次想到,多线程插入,想到数据库连接是需要同步的所以感觉用处不大。
最后想到,使用 PreparedStatement 预编译sql 进行批量插入 batch 处理。
好吧,现在就进行批处理插入测试。
1、使用简单的 batch

public static void main(String[] args) { Connection conn = getConn(lsqlurl, luser, lpassword); long startTime = System.currentTimeMillis(); try { PreparedStatement pst = conn.prepareStatement("insert into testmy (id,name,age) values (?,?,?)"); for (int i = 0; i < 2000; i++) { pst.setInt(1, 3); pst.setString(2, "xx"); pst.setInt(3, 10); pst.addBatch(); } pst.executeBatch(); long endTime = System.currentTimeMillis(); System.out.println((endTime - startTime)/1000+"s"); System.out.println("test sql batch--->2000....."); } catch (SQLException e) { e.printStackTrace(); }finally { if(conn!=null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
登入後複製

你会发现时间会是30s 左右。
2k行的数据插入就30秒 。
2w行数据插入时间为940秒(约16min)。

2、修改自动提交的 batch

public static void main(String[] args) { Connection conn = getConn(lsqlurl, luser, lpassword); long startTime = System.nanoTime(); try { conn.setAutoCommit(false); PreparedStatement pst = conn.prepareStatement("insert into test (id,name,age) values (?,?,?)"); for (int i = 0; i < 2000; i++) { pst.setInt(1, 3); pst.setString(2, "xx"); pst.setInt(3, 10); pst.addBatch(); } pst.executeBatch(); conn.commit(); long endTime = System.nanoTime(); System.out.println((endTime - startTime)/1000000+"ms"); System.out.println("test sql batch--->2000....."); } catch (SQLException e) { try { conn.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } e.printStackTrace(); }finally { if(conn!=null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
登入後複製

2k行插入耗时大概是260ms。
2w行数据插入大概是1.4s。
其实结果很明显的。

因为在使用batch时数据量达到一定的值后数据库会自动提交。而不是你执行executeBatch时再执行。所以我们需要修改自动提交变成手动提交。
这里还有一个问题是:当你实在执行事务时,一旦出错的时候,自动提交会帮你rollback,手动提交时就应该自己进行回退。
所以在catch里需要添加 rollback 。

好了,综上我们可以使用自动提交的batch进行大量数据的插入。

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!