欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-10 18:44:32
...

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

实验结果:
运行结果是毫秒单位
mybatis批量新增和批量更新的效率对比
实验结论:

  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>");