最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

mysql数据库批量快速插入_MySQL

来源:懂视网 责编:小采 时间:2020-11-09 19:55:32
文档

mysql数据库批量快速插入_MySQL

mysql数据库批量快速插入_MySQL:最近在处理一批数据,需要从库中表里的字段进行处理然后导出到一个新表中。不过这个表的数据量有近500w条。这数据量出现的的问题是需要处理的时间好长。 首先想到,一句一句的插入,大数据量处理时间好长,忽略。 其次想到,多线程插入,想到数据库连接是需要
推荐度:
导读mysql数据库批量快速插入_MySQL:最近在处理一批数据,需要从库中表里的字段进行处理然后导出到一个新表中。不过这个表的数据量有近500w条。这数据量出现的的问题是需要处理的时间好长。 首先想到,一句一句的插入,大数据量处理时间好长,忽略。 其次想到,多线程插入,想到数据库连接是需要

最近在处理一批数据,需要从库中表里的字段进行处理然后导出到一个新表中。不过这个表的数据量有近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进行大量数据的插入。

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文档

mysql数据库批量快速插入_MySQL

mysql数据库批量快速插入_MySQL:最近在处理一批数据,需要从库中表里的字段进行处理然后导出到一个新表中。不过这个表的数据量有近500w条。这数据量出现的的问题是需要处理的时间好长。 首先想到,一句一句的插入,大数据量处理时间好长,忽略。 其次想到,多线程插入,想到数据库连接是需要
推荐度:
标签: 添加 批量 数据
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top