mybatis批量新增和批量更新的效率对比

今天,为了更多了解下,mybatis批量新增和批量更新在simple/batch模式 + MySQL的rewriteBatchedStatements下效率有什么区别,做了一次实验。
实验结果,让人意想不到,如果没有亲自测试,可能一直会被网上帖子误导。

实验参数

  1. mybatis的执行类型ExecutorType

    • simply模式
    • batch模式
  2. 形成的SQL语句方式

  3. 多少数据拼写成一条语句

    • simply模式下:100条,一条SQL语句时提交 (这个可以自行调整)
    • batch模式:100条, 每100条SQL语句时提交(这个可以自行调整)
  4. Mysql参数rewriteBatchedStatements : true、false

    • allowMultiQueries=true&rewriteBatchedStatements=true
    • allowMultiQueries=true&rewriteBatchedStatements=false

实验结果:
运行结果是毫秒单位
实验结果
实验结论:

  1. 批量insert时,当rewriteBatchedStatements=true,batch模式最快, 其他情况下simple模式和batch模式都差不多
  2. 批量update(case when) :simple模式和batch模式都差不多
    批量update(foreach) 效率最慢,不可取
  3. 批量insert时,配合rewriteBatchedStatements=true,效率最好,对于批量update稍微有点影响,但是条件允许可以忽略不计
  4. 批量update(case when)时,无论rewriteBatchedStatements=true,simple模式和batch模式效率相差不太大,但是条件允许可以忽略不计

关于update(foreach)效率问题
先看这篇文章:mybatis学习之路----批量更新数据两种方法效率对比
我也对这个进行了实验,发现这个帖子有点误导人,原因如下:

  1. 这个帖子使用 or 方式 拼写条件, 因为使用or 不走索引的,会导致更新效率很慢,让人误导以为case when效率差。 可以参考:mysql关于or的索引问题

    <foreach collection="list" separator="or" item="cus">
             id = #{cus.id}
         </foreach> 
    
  2. 如果使用in方式,批量更新效率会大大提高

      sql.append("WHERE");
       sql.append(" id IN ");
       sql.append("<trim prefix=\"(\" suffix=\")\">");
       sql.append("<foreach collection=\"list\" separator=\", \" item=\"i\" index=\"index\" >");
       sql.append("#{i.id}");
       sql.append("</foreach>");
       sql.append("</trim>");
  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
根据引用和引用,使用case when语句进行批量更新在拼接大量SQL时会比较慢,因为每个case when都需要循环一遍list集合,导致效率问题严重。因此,建议在使用时分批插入,以提高效率。 另一方面,根据引用,第一种方法的效率相当高,因为它只有一个循环体。但是,如果更新语句过多,可能会导致SQL阻塞。 综上所述,mybatis批量更新效率取决于具体的实现方式和数据量大小。如果拼接SQL的方式导致效率问题,可以考虑分批插入的方式来提高效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [mybatis学习之路----批量更新数据两种方法效率对比](https://blog.csdn.net/bingguang1993/article/details/83340122)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [mybatis批量更新数据三种方法效率对比](https://blog.csdn.net/q957967519/article/details/88669552)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值