mysql 批量查询、批量插入优化

这段时间一直在参与产品库的设计和实现,中间和mysql的恩恩怨怨给广大喜欢交流学习的网友们,提供一些借鉴的机会。首先从mysql的批量插入开始吧。

1.mysql批量插入优化。

一直自认为对sql语句的数量使用,完全绝对的低估了现实问题的难度。100w的产品基础数据插入用掉了10个小时的时间。很挫…第一批实验数据100w插入后,让我久久不能释怀,这10个小时让我很纠结。
找原因吧,之前先入为主,一颗天真烂漫的心被一篇jdbc批处理survey的文章所蒙蔽,一直以为批处理的性能不会比单独insert要更快,那就试一下吧。【本文不谈java代码的优化】

Java代码
  1. PreparedStatement pstmt = null;
  2.         Connection con = null;
  3.         try {
  4.             con = JdbcUtil.getConnection();
  5.             con.setAutoCommit(false);
  6.             pstmt = con.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE,
  7.                     ResultSet.CONCUR_READ_ONLY);

  8.             String[] lines = temp.split(ConstUtil.DELIM_ENTER, -1);
  9.             for (int i = 0; i < lines.length; i++) {
  10.                 String[] pdArr = lines[i].split(ConstUtil.DELIM_ONE, -1);

  11.                 if (pdArr.length < 5)
  12.                     return;

  13.                 pstmt.setString(1, pdArr[0]);
  14.                 if (pdArr[1].length() > 13)
  15.                     continue;
  16.                 pstmt.setString(2, pdArr[1]);// isbn
  17.                 pstmt.setString(3, pdArr[2]);
  18.                 pstmt.setString(4, pdArr[3]);
  19.                 pstmt.setString(5, pdArr[4]);
  20.                 pstmt.addBatch();
  21.             }

  22.             pstmt.executeBatch();
  23.             con.commit();

还是100w的实验数据:

首先批处理Threshold=100

Time consuming: 8h

然后批处理Threshold=500

Time consuming: 6.7h

然后批处理Threshold=1000

Time consuming: 5.4h

然后批处理Threshold=2000

Time consuming: 5.3h

看来批处理还是能节省相当的时间。不过Threshold在大也没有多少优化空间了。不过5个多小时的插入时间还是让心情沉重。再想想别的方法,记得jdbc-mysql的实现的新版本中增加了对批处理的支持的优化,那可以试一下嘛。

jdbc driver 版本 5.1.8 及以上支持rewriteBatchedStatements=true参数,该参数帮主mysql打开批处理状态,只需在 jdbc url 后跟一个参数rewriteBatchedStatements=true即可(jdbc:mysql:///test?rewriteBatchedStatements=true)。

引用

然后批处理Threshold=1000

引用
Time consuming: 0.5h

oha,到此批处理的结果才令人满意(600 records/s)

2.批量插入中使用了select查询功能的优化。
还遇到一个非常非常有意思,并且非常
【抱歉,忙起来了,过几天再将这块的实际应用结论整理出来!】

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值