Mybatis plus批量插入的优化

目录

[1 前言](#1 前言)

[2 优化](#2 优化)

[2.1 逐条的插入](#2.1 逐条的插入)

[2.1.1 java的代码如下](#2.1.1 java的代码如下)

[2.1.2 耗时](#2.1.2 耗时)

[2.1.3 优化](#2.1.3 优化)

[2.2 批量编译再插入](#2.2 批量编译再插入)

[2.2.1 java的代码如下](#2.2.1 java的代码如下)

[2.2.2 耗时](#2.2.2 耗时)

[2.2.3 疑问](#2.2.3 疑问)

[2.2.4 优化](#2.2.4 优化)

[2.3 真-批量插入](#2.3 真-批量插入)


1 前言

数据库的常见操作无非增删查改,当有大量数据需要插入的时候,无疑需要耗费大量的时间,此时性能的优化就极为重要,接下来我将逐步讲解如何优化效率。

2 优化

2.1 逐条的插入

2.1.1 java的代码如下

java 复制代码
@Test
void testSaveOneByOne() {
    //其它代码...
    for (int i = 1; i <= 100000; i++) {
        //创建并插入User
        userService.save(buildUser(i));
    }
}

2.1.2 耗时

我们可以看到,逐条插入耗费了大量的时间。

2.1.3 优化

如果使用批量插入将会明显要比逐条插入快许多,这是因为逐条插入每次需要向数据库中提交请求,提交到Mysql然后执行,这个操作是需要耗时间的。而我们以1000个为一批提交请求,这就大大节省了提交请求所耗的时间。如下。

2.2 批量编译再插入

2.2.1 java的代码如下

java 复制代码
void testSaveBatch() {
    for (int i = 1; i <= 100000; i++) {
        //其它代码...
        if (i % 1000 == 0) {
            //1000个为一批的插入
            userService.saveBatch(list);
        }
    }
}

2.2.2 耗时

我们可以看到,耗时已经减少很多了,但是还能再优化。

2.2.3 疑问

这难道还能优化?使用Mybatis的时候为什么没这种问题?为什么呢?

这是因为我们这里使用的是Mybatis plus直接给我们提供的方法,而不是我们自己手写的方法,我们一般会使用<foreach>来达到如下的效果:

sql 复制代码
insert into user(xxx)
values(xx),
      (xx);

这样就是真正的批量插入,一批只需要执行一次 。

而使用Mybatis plus自动给的方法,则只是批量传到Mysql,执行仍然是一条一条执行的,所以速度还没达到极致。

2.2.4 优化

不过上述情况也不能怪Mybatis plus,这是因为我们在Mysql中没开启一个参数,使得Mybatis plus的功能受到了限制,一旦开启,就能做的真正的批量插入了。

2.3 真-批量插入

在application.yml配置文件中,开启参数(rewriteBatchedStatements=true),然后使用Mybatis plus直接给我们提供的批量插入即可。

diff 复制代码
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/xxx?rewriteBatchedStatements=true

耗时:

直接秒了,家人们

相关推荐
激流丶8 分钟前
【Kafka 实战】如何解决Kafka Topic数量过多带来的性能问题?
java·大数据·kafka·topic
Themberfue11 分钟前
Java多线程详解⑤(全程干货!!!)线程安全问题 || 锁 || synchronized
java·开发语言·线程·多线程·synchronized·
让学习成为一种生活方式28 分钟前
R包下载太慢安装中止的解决策略-R语言003
java·数据库·r语言
晨曦_子画34 分钟前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
假装我不帅1 小时前
asp.net framework从webform开始创建mvc项目
后端·asp.net·mvc
南宫生1 小时前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法
神仙别闹1 小时前
基于ASP.NET+SQL Server实现简单小说网站(包括PC版本和移动版本)
后端·asp.net
Heavydrink1 小时前
HTTP动词与状态码
java
ktkiko111 小时前
Java中的远程方法调用——RPC详解
java·开发语言·rpc
计算机-秋大田2 小时前
基于Spring Boot的船舶监造系统的设计与实现,LW+源码+讲解
java·论文阅读·spring boot·后端·vue