外贸建站公司,中装建设千股千评,金数字网站建设,网站建设义乌需求场景#xff1a;定时任务中#xff0c;从其他平台同步数据#xff0c;并更新当前平台数据库#xff0c;表数据3W#xff0c;分批更新某个字段#xff0c;耗时巨大#xff0c;约30min#xff0c;尝试性能优化。
批量更新的几种常见方式#xff1a;
1.foreach 循环…需求场景定时任务中从其他平台同步数据并更新当前平台数据库表数据3W分批更新某个字段耗时巨大约30min尝试性能优化。
批量更新的几种常见方式
1.foreach 循环
在mybatis的xml文件中使用foreach动态标签拼接SQL语句每一条数据的更新语句对应一条update语句多条语句最终使用;号进行拼接。
update idupdateStudentInfoByIdforeach collectionlist itemitem separator;updatet_studentsetname #{item.name},age #{item.age}whereid #{item.id}/foreach
/update2.先删后增取出原数据内存中更新后先将全表数据删除再insert插入或者设置标志字段先增后删思路一致
3.使用replace into 若主键存在则更新不存在插入
REPLACE INTO t_student (id, name, code, hobby)
values (#{item.id}, #{item.name}, #{item.code}, #{item.hobby})
4.批量新增数据若键重复则更新
insert idbatchInsertStudentInfoinsert into t_student (id, code, name, hobby, create_time) valuesforeach collectionstudents itemitem indexindex separator,(#{item.id},#{item.code},#{item.name},#{item.hobby},#{item.createTime})/foreachon duplicate key updatecreate_time values(create_time)
/insert 5.when case 更新
UPDATE t_student
SET name
CASEWHEN id 1 THEN张三 WHEN id 2 THEN李四 WHEN id 3 THEN王五 WHEN id 4 THEN赵六 END,age
CASEWHEN id 1 THEN40 WHEN id 2 THEN34 WHEN id 3 THEN55 WHEN id 4 THEN76 END
WHEREid IN ( 1, 2, 3, 4 )场景分析当前场景需要去更新某个字段且数据量较大几百条数据每批进行更新应用foreach循环更新时耗时巨大
性能优化使用临时表关联全表更新一次关联一次更新
update idupdateTeacherWorkloaddrop temporary table if exists tmp;create temporary table tmp(id varchar(128) primary key, actual_workload varchar(64));update t_teacher_info, (select id, actual_workload from tmp union allforeach collectionupdatedWorkload itemitem separator union all select #{item.id}, #{item.actualWorkload}/foreach) as tmpset t_teacher_info.actual_workload tmp.actual_workload where t_teacher_info.id tmp.id;
/update
结果评估使用临时表后总体耗费时间为12s较原先30min缩短150倍
注意点临时关联更新操作不能应用在Trascational事务中创建临时表的操作在事务中不支持需要做其他处理正常小数量的更新且有事务管理要求则优先使用foreach或其他操作。