最近在引入mybatis-plus后发现其批量插入的性能不高,所以与mybatis的<foreach/>标签生成的sql插入性能做了对比
测试环境:
- 6核12线程,16g内存
- 本地数据库,没有网络传输
- 数据库字段7个,没有超过32位的长字符串
- 超过1000数据量的,按1000分批插入
- 开启事务
首先给出结论:
- 小数据量时(小于1000),性能相差不大。
- 数据库url未加rewriteBatchedStatements=true时,mybatis性能高于mybatis-plus,大于5000数据量时,差不多是4倍的差距
- 数据库url加rewriteBatchedStatements=true时,mybatis-plus性能高于mybatis,大于5000数据量时,差不多是1.5倍差距
所以增加配置后,mybatis-plus的批量插入性能不低,基本无代码入侵,也不会影响已有的代码,其对单表的操作很方便,可以考虑引入使用。
1、性能测试对比
测试代码如下:
@Transactional
@Override
public void batchInsert(Integer total, String type) {
List<UserInfo> list = new ArrayList<>(total);
Date date = new Date();
for (int i = 0; i < total; i++) {
UserInfo userInfo = new UserInfo();
userInfo.setName("" + i);
userInfo.setPhone("13266665555");
userInfo.setCreateTime(date);
userInfo.setIsDelete(1);
userInfo.setFirstPinyin("" + i);
list.add(userInfo);
}
long start = System.currentTimeMillis();
if ("mybatis-plus".equals(type)) {
this.saveBatch(list);
} else {
//分批插入,每次插入1000条
List<List<UserInfo>> listList = ListUtil.partition(list, 1000);
listList.forEach(e -> userInfoMapper.insertBatch(e));
}
long end = System.currentTimeMillis();
System.out.println(type + "批量插入(" + total + "条)数据所用时间: " + (end - start) / 1000.00 + "s");
}
测试结果如下: