mysql批量更新的两种⽅式效率试验⼆
Mysql两种批量更新的对⽐
简介:
mysql搭载mybits框架批量更新有两种⽅式,⼀种是在xml中循环整个update语句,中间以‘;’隔开,还有⼀种是使⽤case when 变相实现批量更新,现就两种⽅法的效率做以对⽐。
两种写法:
⽅法⼀:整体循环update语句
注意:mysql默认不⽀持⼀条预编译sql以 ’; ’ 分割这种⽅式执⾏,需要在mysql 的jdbcUrl参数上追加 allowMultiQueries=true开启⽀持SQL如下:
<!-- 批量更新表整体循环update语句-->
<update id="updateByForech" parameterType="java.util.List">
<foreach collection="list" item="item" >
update t_user
<set>
<if test="item.tName != null and item.tName != ''">
t_name = #{item.tName,jdbcType=VARCHAR},
</if>
<if test="item.tAge != null">
t_age = #{item.tAge},
</if>
<if test="item.tAddress != null">
t_address = #{item.tAddress,jdbcType=VARCHAR},
</if>
<if test="item.tPwd!= null">
t_pwd = #{item.tPwd,jdbcType=VARCHAR},
</if>
</set>
where t_id = #{item.tId};
</foreach>
</update>
该⽅法编写简单,便于理解,但是需要修改系统参数。
⽅法⼆:使⽤case when ⽅式拼接
SQL如下:
<!--caseWhen更新-->
<update id="updateByCaseWhen" parameterType="java.util.List">
update t_user
<trim prefix="set" suffixOverrides=",">
<trim prefix="t_name =case" suffix="end,">
<foreach collection="list" item="item">
<if test="item.tName !=null and item.tName != ''">
when t_id=#{item.tId} then #{item.tName,jdbcType=VARCHAR}
</if>
</foreach>
</trim>
<trim prefix="t_address =case" suffix="end,">
<foreach collection="list" item="item">
批量更新sql语句<if test="item.tAddress != null and item.tAddress != ''">
when t_id=#{item.tId} then #{item.tAddress,jdbcType=VARCHAR}
</if>
</foreach>
</trim>
<trim prefix="t_age =case" suffix="end,">
<foreach collection="list" item="item">
<if test="item.tAge != null">
when t_id=#{item.tId} then #{item.tAge}
</if>
</foreach>
</trim>
<trim prefix="t_pwd =case" suffix="end,">
<foreach collection="list" item="item">
<if test="item.tPwd != null">
when t_id=#{item.tId} then #{item.tPwd}
</if>
</foreach>
</trim>
</trim>
where t_id in
<foreach collection="list" item="item" separator="," open="(" close=")">
#{item.tId}
</foreach>
</update>
该⽅法sql 拼接复杂,为每⼀个要更新的字段罗列出id值,若数据出现问题,定位困难。
效率统计:
1. 批量更新10条数据两种⽅法⽤时统计:
时间可以忽略不计;
1. 批量更新100条数据两种⽅法⽤时统计:
1. 批量更新1000条数据两种⽅法⽤时统计:
1. 批量更新5000条数据两种⽅法⽤时统计:
1. 批量更新10000条数据两种⽅法⽤时统计:
总结:
1.⼀次修改数据量较⼩的情况下, case when⽅式和整体更新⽅式均可选择,但是整体更新需要新增系统参数配置
2.对于经常出现数据问题的,建议使⽤整体循环update⽅式,该⽅式⽣sql就是简单的update语句的拼接,便于定位问题。⽽case when⽅式会在每⼀个需要修改的参数后⾯罗列出主键,切在mapper⽂件中出现⼤量冗余。
3.对于批量更新数据量很⼤的情况,case when效率低下,建议使⽤整体循环update。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论