MYSQL批量UPDATE的两种方式

工作中遇到批量更新的场景其实是比较常见的。

但是该如何正确的进行批量UPDATE,很多时候往往有点头大。

这里列2种可用的方式,供选择(请选择方式一,手动狗头。)。

如果使用了MyBatis增强组件MyBatisPlus

如果使用了MyBatisPlus,可以参考官网给出的解决方式(updateBatchById),或者自己查一下。


批量UPDATE方式一:SQL内foreach

举个??

复制代码
<update id="updateUserForBatch" parameterType="com.bees.srx.entity.UserEntity">
	<foreach collection="list" item="entity" separator=";">
		UPDATE sys_user
		SET password=#{entity.password},age=#{entity.age}
		<where>
			id = #{entity.id}
		</where>
	</foreach>
</update>

这样写,肯定比 在业务方法中for循环单条update的效率是要高的。

但是如果遇到大批量的更新动作,可能也会产生效率低下的问题。

原因是SQL内的foreach本质上还是循环插入每一条数据,会产生 list.size() 个单条插入的独立SQL语句,每一条 UPDATE 语句都会被单独发送到数据库服务器执行。

这意味着如果列表中有100个元素,就会产生100次数据库往返通信。

这种方式不仅效率低下,而且对于大型批处理操作来说,可能会导致性能瓶颈和资源浪费。

优化:通过JDBC批处理

通过 MyBatisSqlSession 提供的批处理功能来手动执行批量更新。

复制代码
try (SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH)) {
    UserMapper mapper = session.getMapper(UserMapper.class);
    for (UserEntity user : userList) {
        mapper.updateUser(user);
    }
    session.commit();
}

这里mapper.updateUser就是单条的UPDATE语句。

通过这种方式,MyBatis 会在内存中积累所有的更新命令,然后在调用session.commit() 时一次性提交给数据库,这比逐条执行要高效得多。

注意:是否存在效率差异,未实践过!!!可能存在误人子弟的嫌疑。

批量UPDATE方式二:INSERT + ON DUPLICATE KEY UPDATE
复制代码
 <update id="updateForBatch" parameterType="com.bees.srx.entity.UserEntity">
    insert into sys_user
    (id,username,password) values
    <foreach collection="list" index="index" item="item" separator=",">
        (#{item.id},
        #{item.username},
        #{item.password})
    </foreach>
    ON DUPLICATE KEY UPDATE
     password=values(password)
</update>

不建议使用。要求较多,而且容易出现死锁。

注意事项

  • 唯一键约束:确保 sys_user 表中的 id 字段有唯一键约束(通常是主键)。如果 id 不是唯一的,ON DUPLICATE KEY UPDATE 将不会触发更新操作。
  • 性能:这种方式在大数据量的情况下比多次单独的 INSERT 和 UPDATE 操作要高效得多。
  • 事务管理:确保这个操作在一个事务中执行,以保证数据的一致性。如果中间发生错误,可以回滚整个操作。
  • 字段顺序:确保 VALUES 函数中的字段顺序与 ON DUPLICATE KEY UPDATE 子句中的字段顺序一致。
总结:

建议使用方式一,或者其优化方式(JDBC批处理)。

各位也可以与AI对话看看给出的建议是什么。


有问题一定要留言啊各位。及时发现及时改错。

相关推荐
被摘下的星星19 小时前
MySQL count()函数的用法
数据库·mysql
末央&19 小时前
【天机论坛】项目环境搭建和数据库设计
java·数据库
徒 花19 小时前
数据库知识复习07
数据库·作业
素玥19 小时前
实训5 python连接mysql数据库
数据库·python·mysql
jnrjian19 小时前
text index 查看index column index定义 index 刷新频率 index视图
数据库·oracle
瀚高PG实验室20 小时前
审计策略修改
网络·数据库·瀚高数据库
言慢行善20 小时前
sqlserver模糊查询问题
java·数据库·sqlserver
韶博雅20 小时前
emcc24ai
开发语言·数据库·python
有想法的py工程师20 小时前
PostgreSQL 分区表排序优化:Append Sort 优化为 Merge Append
大数据·数据库·postgresql
喵了几个咪20 小时前
如何在 Superset Docker 容器中安装 MySQL 驱动
mysql·docker·容器·superset