当前位置:   article > 正文

Mybatis批量更新数据及其优化_mybatis批量更新几千条数据

mybatis批量更新几千条数据

需求场景定时任务中,从其他平台同步数据,并更新当前平台数据库,表数据3W+,分批更新某个字段,耗时巨大,约30min,尝试性能优化。

批量更新的几种常见方式:

1.foreach 循环

在mybatis的xml文件中,使用foreach动态标签拼接SQL语句,每一条数据的更新语句对应一条update语句,多条语句最终使用";"号进行拼接。

  1. <update id="updateStudentInfoById">
  2. <foreach collection="list" item="item" separator=";">
  3. update
  4. t_student
  5. set
  6. name = #{item.name},
  7. age = #{item.age}
  8. where
  9. id = #{item.id}
  10. </foreach>
  11. </update>

2.先删后增,取出原数据内存中更新后,先将全表数据删除,再insert插入;或者设置标志字段,先增后删,思路一致

3.使用replace into 若主键存在则更新,不存在插入

  1. REPLACE INTO t_student (id, name, code, hobby)
  2. values (#{item.id}, #{item.name}, #{item.code}, #{item.hobby})

4.批量新增数据,若键重复则更新

  1. <insert id="batchInsertStudentInfo">
  2. insert into t_student (id, code, name, hobby, create_time) values
  3. <foreach collection="students" item="item" index="index" separator=",">
  4. (
  5. #{item.id},
  6. #{item.code},
  7. #{item.name},
  8. #{item.hobby},
  9. #{item.createTime}
  10. )
  11. </foreach>
  12. on duplicate key update
  13. create_time = values(create_time)
  14. </insert>

 5.when case 更新

  1. UPDATE `t_student`
  2. SET `name` =
  3. CASE
  4. WHEN `id` = 1 THEN
  5. '张三'
  6. WHEN `id` = 2 THEN
  7. '李四'
  8. WHEN `id` = 3 THEN
  9. '王五'
  10. WHEN `id` = 4 THEN
  11. '赵六'
  12. END,
  13. `age` =
  14. CASE
  15. WHEN `id` = 1 THEN
  16. 40
  17. WHEN `id` = 2 THEN
  18. 34
  19. WHEN `id` = 3 THEN
  20. 55
  21. WHEN `id` = 4 THEN
  22. 76
  23. END
  24. WHERE
  25. `id` IN ( 1, 2, 3, 4 )

场景分析:当前场景需要去更新某个字段,且数据量较大,几百条数据每批进行更新,应用foreach循环更新时,耗时巨大;

性能优化:使用临时表关联全表更新,一次关联,一次更新;

  1. <update id="updateTeacherWorkload">
  2. drop temporary table if exists tmp;
  3. create temporary table tmp(id varchar(128) primary key, actual_workload varchar(64));
  4. update t_teacher_info, (select id, actual_workload from tmp union all
  5. <foreach collection="updatedWorkload" item="item" separator=" union all ">
  6. select #{item.id}, #{item.actualWorkload}
  7. </foreach>) as tmp
  8. set t_teacher_info.actual_workload = tmp.actual_workload where t_teacher_info.id = tmp.id;
  9. </update>

结果评估:使用临时表后总体耗费时间为12s,较原先30min,缩短150倍;

注意点:临时关联更新操作不能应用在Trascational事务中,创建临时表的操作在事务中不支持,需要做其他处理;正常小数量的更新且有事务管理要求,则优先使用foreach或其他操作。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/468680
推荐阅读
相关标签
  

闽ICP备14008679号