MySQL批量插入数据的四种方案(性能测试对比) |
您所在的位置:网站首页 › 如何进行方案对比 › MySQL批量插入数据的四种方案(性能测试对比) |
来源:blog.csdn.net/a18505947362/article/details/123667215 本文记录个人使用MySQL插入大数据总结较实用的方案,通过对常用插入大数据的4种方式进行测试,即for循环单条、拼接SQL、批量插入saveBatch()、循环 + 开启批处理模式,得出比较实用的方案心得。 一、前言最近趁空闲之余,在对MySQL数据库进行插入数据测试,对于如何快速插入数据的操作无从下手,在仅1W数据量的情况下,竟花费接近47s,实在不忍直视!在不断摸索之后,整理出一些较实用的方案。 二、准备工作测试环境:SpringBoot项目、MyBatis-Plus框架、MySQL8.0.24、JDK13 前提:SpringBoot项目集成MyBatis-Plus上述文章有配置过程,同时实现IService接口用于进行批量插入数据操作saveBatch()方法 1、Maven项目中pom.xml文件引入的相关依赖如下 代码语言:javascript复制 org.springframework.boot spring-boot-starter-web com.baomidou mybatis-plus-boot-starter 3.3.1 mysql mysql-connector-java org.projectlombok lombok2、application.yml配置属性文件内容(重点:开启批处理模式) 代码语言:javascript复制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.Driver3、Entity实体类(测试) 代码语言:javascript复制/** * 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)、释放连接和资源关闭等操作上,(如果数据量大的情况下)极其消耗资源,导致时间长。 代码语言:javascript复制@GetMapping("/for") public void forSingle(){ // 开始时间 long startTime = System.currentTimeMillis(); for (int i = 0; i |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |