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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sunct/article/details/90147304

今天,为了更多了解下,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>");

猜你喜欢

转载自blog.csdn.net/sunct/article/details/90147304
今日推荐