MySQL优化:批量插入大数据4种实用、讲究方案的测试

article/2025/10/25 1:39:10

     简明:本文记录个人使用MySQL插入大数据总结较实用的方案,通过对常用插入大数据的4种方式进行测试,即for循环单条拼接SQL批量插入saveBatch()循环 + 开启批处理模式,得出比较实用的方案心得。

   (个人记录学习笔记内容,若文中出现考虑不周、理解错误等情况,请多指出,共同学习!!!)

一、前言

         最近趁空闲之余,在对MySQL数据库进行插入数据测试,对于如何快速插入数据的操作无从下手,在仅1W数据量的情况下,竟花费接近47s,实在不忍直视!在不断摸索之后,整理出一些较实用的方案。

二、准备工作

测试环境:SpringBoot项目、MyBatis-Plus框架、MySQL8.0.24、JDK13

前提:SpringBoot项目集成MyBatis-Plus上述文章有配置过程,同时实现IService接口用于进行批量插入数据操作saveBatch()方法

1、Maven项目中pom.xml文件引入的相关依赖如下

	<dependencies><!-- SpringBoot Web模块依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- MyBatis-Plus 依赖 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.3.1</version></dependency><!-- 数据库连接驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- 使用注解,简化代码--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies>

2、application.yml配置属性文件内容(重点:开启批处理模式

server:# 端口号 port: 8080#  MySQL连接配置信息(以下仅简单配置,更多设置可自行查看)
spring:datasource:#  连接地址(解决UTF-8中文乱码问题 + 时区校正)#         (rewriteBatchedStatements=true 开启批处理模式)url: jdbc:mysql://127.0.0.1:3306/bjpowernode?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true#  用户名username: root#  密码password: xxx#  连接驱动名称driver-class-name: com.mysql.cj.jdbc.Driver

3、Entity实体类(测试)

/***   Student 测试实体类*   *   @Data注解:引入Lombok依赖,可省略Setter、Getter方法*   @author LBF*   @date 2022/3/18 16:06*/
@Data
@TableName(value = "student")
public class Student {/**  主键  type:自增 */@TableId(type = IdType.AUTO)private int id;/**  名字 */private String name;/**  年龄 */private int age;/**  地址 */private String addr;/**  地址号  @TableField:与表字段映射 */@TableField(value = "addr_num")private String addrNum;public Student(String name, int age, String addr, String addrNum) {this.name = name;this.age = age;this.addr = addr;this.addrNum = addrNum;}
}

4、数据库student表结构(注意:无索引

三、测试工作

       简明:完成准备工作后,即对for循环拼接SQL语句批量插入saveBatch()循环插入+开启批处理模式,该4种插入数据的方式进行测试性能。

       注意:测试数据量为5W、单次测试完清空数据表(确保不受旧数据影响)

    (  以下测试内容可能受测试配置环境、测试规范和数据量等诸多因素影响,读者可自行结合参考进行测试  )

1、for循环插入(单条)(总耗时:177秒)

      总结:测试平均时间约是177秒,实在是不忍直视(捂脸),因为利用for循环进行单条插入时,每次都是在获取连接(Connection)、释放连接和资源关闭等操作上,(如果数据量大的情况下)极其消耗资源,导致时间长。

    @GetMapping("/for")public void forSingle(){// 开始时间long startTime = System.currentTimeMillis();for (int i = 0; i < 50000; i++){Student student = new Student("李毅" + i,24,"张家界市" + i,i + "号");studentMapper.insert(student);}// 结束时间long endTime = System.currentTimeMillis();System.out.println("插入数据消耗时间:" + (endTime - startTime));}

(1)第一次测试结果:190155 约等于 190秒

(2)第二次测试结果:175926 约等于 176秒(服务未重启)

(3)第三次测试结果:174726 约等于 174秒(服务重启) 

2、拼接SQL语句(总耗时:2.9秒)

    简明: 拼接格式:insert into student(xxxx) value(xxxx),(xxxx),(xxxxx).......

    总结:拼接结果就是将所有的数据集成在一条SQL语句的value值上,其由于提交到服务器上的insert语句少了,网络负载少了,性能也就提上去。但是当数据量上去后,可能会出现内存溢出、解析SQL语句耗时等情况,但与第一点相比,提高了极大的性能。

    @GetMapping("/sql")public void sql(){ArrayList<Student> arrayList = new ArrayList<>();long startTime = System.currentTimeMillis();for (int i = 0; i < 50000; i++){Student student = new Student("李毅" + i,24,"张家界市" + i,i + "号");arrayList.add(student);}studentMapper.insertSplice(arrayList);long endTime = System.currentTimeMillis();System.out.println("插入数据消耗时间:" + (endTime - startTime));}
    // 使用@Insert注解插入:此处为简便,不写Mapper.xml文件@Insert("<script>" +"insert into student (name,age,addr,addr_num) values " +"<foreach collection='studentList' item='item' separator=','> " +"(#{item.name}, #{item.age}, #{item.addr}, #{item.addrNum}) " +"</foreach> " +"</script>")int insertSplice(@Param("studentList") List<Student> studentList);

 (1)第一次测试结果:3218 约等于 3.2秒

(2)第二次测试结果:2592 约等于 2.6秒(服务未重启)

(3)第三次测试结果:3082 约等于 3.1秒(服务重启) 

3、批量插入saveBatch(总耗时:2.7秒)

     简明:使用MyBatis-Plus实现IService接口中批处理saveBatch()方法,对底层源码进行查看时,可发现其实是for循环插入,但是与第一点相比,为什么性能上提高了呢?因为利用分片处理(batchSize = 1000) + 分批提交事务的操作,从而提高性能,并非在Connection上消耗性能。

    @GetMapping("/saveBatch1")public void saveBatch1(){ArrayList<Student> arrayList = new ArrayList<>();long startTime = System.currentTimeMillis();// 模拟数据for (int i = 0; i < 50000; i++){Student student = new Student("李毅" + i,24,"张家界市" + i,i + "号");arrayList.add(student);}// 批量插入studentService.saveBatch(arrayList);long endTime = System.currentTimeMillis();System.out.println("插入数据消耗时间:" + (endTime - startTime));}

 (1)第一次测试结果:2864 约等于 2.9秒

(2)第二次测试结果:2302 约等于 2.3秒(服务未重启) 

(3)第三次测试结果:2893 约等于 2.9秒(服务重启) 

    重点注意:MySQL JDBC驱动默认情况下忽略saveBatch()方法中的executeBatch()语句,将需要批量处理的一组SQL语句进行拆散,执行时一条一条给MySQL数据库,造成实际上是分片插入,即与单条插入方式相比,有提高,但是性能未能得到实质性的提高。

     测试:数据库连接URL地址缺少 rewriteBatchedStatements = true 参数情况

#  MySQL连接配置信息
spring:datasource:#  连接地址(未开启批处理模式)url: jdbc:mysql://127.0.0.1:3306/bjpowernode?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai#  用户名username: root#  密码password: xxx#  连接驱动名称driver-class-name: com.mysql.cj.jdbc.Driver

测试结果:10541 约等于 10.5秒(未开启批处理模式

4、循环插入 + 开启批处理模式(总耗时:1.7秒)(重点:一次性提交

      简明:开启批处理,关闭自动提交事务,共用同一个SqlSession之后,for循环单条插入的性能得到实质性的提高;由于同一个SqlSession省去对资源相关操作的耗能、减少对事务处理的时间等,从而极大程度上提高执行效率。(目前个人觉得最优方案)

    @GetMapping("/forSaveBatch")public void forSaveBatch(){//  开启批量处理模式 BATCH 、关闭自动提交事务 falseSqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH,false);//  反射获取,获取MapperStudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);long startTime = System.currentTimeMillis();for (int i = 0 ; i < 50000 ; i++){Student student = new Student("李毅" + i,24,"张家界市" + i,i + "号");studentMapper.insertStudent(student);}// 一次性提交事务sqlSession.commit();// 关闭资源sqlSession.close();long endTime = System.currentTimeMillis();System.out.println("总耗时: " + (endTime - startTime));}

(1)第一次测试结果:1831 约等于 1.8秒

(2)第二次测试结果:1382 约等于 1.4秒(服务未重启) 

(3)第三次测试结果:1883 约等于 1.9秒(服务重启) 

四、总结 

       本文记录个人学习MySQL插入大数据一些方案心得,可得知主要是在获取连接、关闭连接、释放资源和提交事务等方面较耗能,其中最需要注意是开启批处理模式,即URL地址的参数:rewriteBatchedStatements = true,否则也无法发挥作用。对于测试方案的设定、对考虑不周、理解和编写错误的地方等情况,请多指出,共同学习!


http://chatgpt.dhexx.cn/article/L9eQ7HEM.shtml

相关文章

Hi3559A Hi3519A Hi3556A算力对比

Hi3559A Hi3519A Hi3556A算力对比 Hi3559A 即Hi3559ARFCV100 4T算力 封装 FC-BGA 常备 Hi3519A Hi3519ARFVV100 才是AI芯片 2T算力 订货 先进的智能IP摄像头Soc Hi3519V101 先进的工业IP摄像头Soc Hi3516DV300 1T算力 常备 专业4M智能IP摄像SoC Hi3516CV500 0.5T算力 常备货…

海思Hi3798MV310芯片处理器参数介绍

Hi3798MV310是用于IPTV/OTT机顶盒市场的支持4KP60 解码的超高清高性能SOC芯片。集成4核64位高性能Cortex A53处理器和多核高性能 2D/3D加速引擎&#xff1b;支持H.265/AVS2 4Kx2KP60 10bit 超高清视频解码&#xff0c;高性能的 H.265 高清视频编码&#xff0c;HDR视频解码及显示…

湖北电信黑盒创维E900V21E-HI3798MV310-MT7661RSN-当贝桌面-免拆卡刷固件包

湖北电信黑盒创维E900V21E-HI3798MV310-MT7661RSN-当贝桌面-免拆卡刷固件包-内有主板图及教程 特点&#xff1a; 1、适用于对应型号的电视盒子刷机&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、修改dns&#xff0c;三网通用&#xff1b; 4、大量…

移动机顶盒migu-jt-u1 unt400c刷机 hi3798 root

准备好u盘&#xff0c;把固件放进去&#xff0c;插到机顶盒上 1&#xff0c;打开机顶盒天灵盖。短接这两个敏感点&#xff0c;开机&#xff0c;不松手&#xff0c;等出现刷机界面。 视频 链接&#xff1a; caiyun.139.com/m/i?105Cq73pcbcbW 提取码&#xff1a;Bgq3 复制内容…

海思AI芯片(Hi3519A/3559A)方案学习(三)Ubuntu18.0.4上编译Hi3519AV100 uboot和kernel

先重申下我的平台为ubuntu18.0.4&#xff0c;SDK的目标平台为Hi3519AV100系列 准备工作 安装himix200交叉编译器 tar –xzf arm-himix200-linux.tgzsudo ./arm-himix200-linux.installsource /etc/profile 安装SDK包 tar -zxf Hi3519AV100_SDK_V2.0.1.0.tgzsudo ./sdk.unp…

Hi3798M V200 SDK文档介绍

目录 下载SDK并解压解压后主要的文件夹 下载SDK并解压 步骤1&#xff1a;下载Hi3798M V200 SDK。 大家如果有下载路径可以直接下载&#xff0c;如果没有的话可以使用我这个路径。 链接&#xff1a;https://pan.baidu.com/s/1buqwwZ7yBPNmi6JA2KG1eQ 提取码&#xff1a;dv6f ps…

FPGA+海思Hi3559

海思3559av100接收FPGA通过LVDS发送的模拟数据&#xff0c;&#xff0c;模拟数据为彩带。 FPGA可以模拟彩带或者黑白灰图像的模拟数据&#xff0c;通过LVDS协议&#xff08;LVDS为低电压差分信号&#xff0c;核心是采用极低的电压摆幅高速差动传输数据&#xff0c;可以实现点对…

海思Hi3798MV310机顶盒芯片Datasheet-基本信息

Hi3798M V310 是用于 IPTV/OTT 机顶盒市场的支持 4KP60 解码的超高清高性能 SOC芯片。集成 4 核 64 位高性能 Cortex A53 处理器和多核高性能 2D/3D 加速引擎&#xff1b;支持H.265/AVS2 4Kx2KP60 10bit 超高清视频解码&#xff0c;高性能的 H.265 高清视频编码&#xff0c;HDR…

海思Hi3798MV200机顶盒芯片规格书-基本信息

Hi3798MV200 是用于 IPTV/OTT 机顶盒市场的支持 4KP60 解码的全 4K 高性能 SOC芯片。集成 4 核 64 位高性能 Cortex A53 处理器和多核高性能 2D/3D 加速引擎;支持H.265 4Kx2K@P60 10bit 超高清视频解码,高性能的 H.265 高清视频编码,HDR 视频解码及显示,HDR 转 SDR,BT.202…

hi3798mv300是什么手机_海思Hi3798MV300/Hi3798MV310/Hi3798MV300H共升级包使用指南芯片手册...

本文针对现网各种场景&#xff0c;对hi3798MV300、Hi3798MV310、Hi3798MV300H共升级包方案的升级包的编译、制作方法和原理进行了详细介绍。 适用场景 场景1&#xff1a; 现网同时有Hi3798MV300和Hi3798MV300H&#xff0c;而且版本基线相同&#xff0c;现需要升级到最新版本 场…

Hi3519AV100 适配IMX347

前言 环境介绍&#xff1a; 1.编译环境 Ubuntu 18.04.5 LTS 2.SDK Hi3519AV100_SDK_V2.0.1.0 3.单板 Hi3519AV100开发板 IMX347 2688x1520(4M)30fps master mode i2c id 0x34 一、Sensor i2c寄存器读写 海思默认文件系统是有i2c读写工具的&#xff0c;可以使用这个工具…

海思Hi3798硬件设计,Hi3798 datasheet(2)参考资料

本文主要介绍 Hi3798C V200 芯片的硬件封装、管脚描述、管脚复用寄存器的配置方法、电气特性参数、原理图设计建议、PCB 设计建议、热设计建议等内容。本文主要为硬件工程师提供硬件设计的参考。 2.1 封装 Hi3798C V200 芯片 TFBGA&#xff08;Thin Fine BGA package&#xf…

HI3798MV200驱动移植

目录 1.UBOOT配置修改方法 2.由EMMC启动改为SPI NAND FLASH 启动 3.网络调试 4.PHY复位 5.内核起来网络不通 6.增加RTC 7.PHY 灯ACT LINK 问题 8.PHY link状态查询 9.ETH0 网络状态灯修改 1.UBOOT配置修改方法 需要对应版本的HITOOL&#xff0c;个人也是废了很大劲&a…

M301H-BYT代工-支持Hi3798 MV300H/MV300/MV310芯片-当贝纯净桌面-强刷卡刷固件包

M301H-BYT代工-支持Hi3798 MV300H&#xff0f;MV300&#xff0f;MV310芯片-当贝纯净桌面-强刷卡刷固件包 特点&#xff1a; 1、适用于对应型号的电视盒子刷机&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、修改dns&#xff0c;三网通用&#xff…

Hi3798 openSSH的移植

前言 在编译海思SDK时&#xff0c;会自动编译openssl&#xff0c;zlib&#xff0c;故无需重复编译这两者。 编译 编译openssh 本文下载openssh-7.3p1版本&#xff0c;将其下载至虚拟机 tar -xvf openssh-7.3p1.tar.gz ./configure --hostarm-linux --prefix/usr/local/ope…

海思HI3798M GPIO和PWM操作

一、GPIO拉高拉低操作 以GPIO2_7为例 地址&#xff08;0xF8B2_2400&#xff09; 基地址&#xff08;0xF8B2_2000&#xff09; 偏移地址&#xff08;0x00000400&#xff09; ①把GPIO2_7管脚复用设置为IO模式 himm 0xF8B2205C 0x00&#xff08;0xF8B2205C 基地址0xF8B2_2000 …

海思Hi3798MV100机顶盒芯片介绍

Hi3798M V100是海思推出的专门针对OTT机顶盒市场的高性价比芯片方案。在码流兼容性、在线视频播放的流畅性、图像质量以及整机性能方面保持业界最好的用户体验。集成四核高性能处理器、内置NEON&#xff0c;其处理性能可以满足各种差异化的业务需求&#xff0c;支持Dolby和DTS音…

海思Hi3798MV300_Hi3798MV300H_Datasheet-系统

Hi3798MV300/Hi3798MV300H处理器子系统 Hi3798MV300/Hi3798MV300H采用 ARMCortex-A53MPCore 四核处理器&#xff0c;Cortex-A53 MPCore 具有以下特点&#xff1a;  处理器集成了 256KB L2 cache。  支持 ARMv8-A 架构。  支持 DVFS 自动调频调压和 AVS 自适应调压。 …

海思Hi3798处理器参数,Hi3798芯片详细信息介绍

Hi3798C V200集成4核64位高性能Cortex A53 处理器、内置NEON 加速引擎&#xff0c;强大的CPU 处理能力可以满足各种差异化的业务需求。在码流兼容性、在线视频播放的流畅性、图像质量以及整机性能方面保持业界最好的用户体验。支持4K 2KP6010bit 超高清视频解码和显示&#xff…

Linq两个List集合取交集

来自森大科技官方博客 http://www.cnsendblog.com/index.php/?p210 GPS平台、网站建设、软件开发、系统运维&#xff0c;找森大网络科技&#xff01; http://cnsendnet.taobao.com 1、法一&#xff1a;常规方法 2、嗯&#xff0c;.NET中所有的sort&#xff0c;compare都支持…