插入大量数据速度慢的解决方法:批量插入 た 入场券 2022-06-05 00:56 293阅读 0赞 ## 场景: ## 项目需要导入案件2200条。其中导入的excel每个行案件的信息上包含大约15个联系方式。那么总的联系方式一共用30000条左右 这里优化之前的速度是16-20分钟之间。太慢了。找了好久优化的方法。最后确定了使用mysql批量插入的方法去进行插入操作 ## 慢的原因及解决思路: ## 这里慢的原因是针对本项目: 插入方式为程序遍历循环逐条插入。在mysql上检测插入一条的速度在0.02s到0.04s之间。 所以逐条插入的速度是0.03\*30000条的速度是15分钟左右。 所以逐条插入是没法优化的。然后去查询优化方式。发现用批量插入的方法可以提高很大速度。 将30000条数据的插入速度提升到1-2分钟左右 ## 这里放一个测试demo例子: ## ### 用junit测试循环插入1000条数据的时间与用批量插入插入10000条使用的时间 1普通循环插入1000条数据的时间测试 ### @Test public void insertCuiji() { List<Cuiji> list= new ArrayList<Cuiji>(); Cuiji cuiji = new Cuiji(); cuiji.setBankcode("jylh"); cuiji.setCompanycode("qixin"); for (int i = 0; i < 1000; i++) { cuijiMapper.insertSelectiveO(cuiji, "jylh"); } } ![Center][] 执行速度是38s也就是0.038\*1000的速度。比较慢了 ### 2用批量插入插入10000条使用的时间 ### @Test public void insertCuiji() { List<Cuiji> list= new ArrayList<Cuiji>(); for (int i = 0; i < 1000; i++) { Cuiji cuiji = new Cuiji(); cuiji.setBankcode("jylh"); cuiji.setCompanycode("qixin"); list.add(cuiji); } cuijiMapper.insertListCuiji(list); } ![Center 1][] 批量插入使用了0.0356s 这相当于插入一条数据的速度,所以用批量插入会大大提升数据插入速度,当有较大数据插入操作是用批量插入优化 ## 批量插入的写法: ## dao定义层方法 Integer insertListCuiji(List<Cuiji> cuiji); mybatis 的sql写法 <insert id="insertListCuiji" parameterType="java.util.List"> INSERT INTO `case`.`t_cuiji` ( `doccode`, `companycode`, `bankcode`, `notes`, `type`) values <foreach collection="list" item="item" separator="," index="index"> (#{item.doccode}, #{item.companycode}, #{item.bankcode}, #{item.notes}, #{item.type}) </foreach> </insert> 这样就能进行批量插入操作: 注:当批量操作数据量大的时候。例如我插入3w条数据要操作的数据包超过了1M会报 Mysql You can change this value on the server by setting the max\_allowed\_packet' variable. 异常 此时修改mysql的max\_allowed\_packet大小即可,详细解决方法请看: http://blog.csdn.net/alice\_qixin/article/details/78522600 或者将list分成几份去插入。 谢谢观看! [Center]: /images/20220605/97ab3b787e5e4ad2bbaa150975129ccd.png [Center 1]: /images/20220605/017edd2970d143a9a449bda407d52a0c.png
还没有评论,来说两句吧...