首页 > 数据库 >【java】[sql]使用Java程序向MySql数据库插入一千万条记录,各种方式的比较,最后发现insert批量插入方式对效率提升最明显

【java】[sql]使用Java程序向MySql数据库插入一千万条记录,各种方式的比较,最后发现insert批量插入方式对效率提升最明显

时间:2023-08-21 21:37:19浏览次数:49  
标签:insert Java cnblogs 千万条 stmt https MySql com name

转:https://www.cnblogs.com/heyang78/p/11666743.html

我的数据库环境是mysql Ver 14.14 Distrib 5.6.45, for Linux (x86_64) using EditLine wrapper

这个数据库是安装在T440p的虚拟机上的,操作系统为CentOs6.5.

我的数据表是这样的:

CREATE TABLE `emp` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `age` smallint(3) DEFAULT NULL,
  `cdate` timestamp NULL DEFAULT NULL COMMENT 'createtime',
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=13548008 DEFAULT CHARSET=utf8;

 insert批量插入就是以下面这种方式写SQL语句

insert into emp(name,age,cdate) 

values

('A' , 20, '2019-10-13 00:00:00'),

('B' , 21, '2019-10-13 01:00:00'),

('C' , 22, '2019-10-13 05:00:00')

对比表格如下

序号 测试链接 用时 采用类库 sql写法 提交方式 stmt/pstmt   
1 https://www.cnblogs.com/xiandedanteng/p/11666614.html 4m55s Spring JDBC Template insert into emp(name,age,cdate)values('','',''),('','',''),('','',''),('','',''),('','','') stmt.execute(sql)  stmt  
2 https://www.cnblogs.com/xiandedanteng/p/11661796.html 5m MyBatis MyBatis batch Insert,具体实现估计就是上面的方式 估计为stmt.execute(sql),因为sql长度可调整   stmt  
3 https://www.cnblogs.com/xiandedanteng/p/11666614.html 4m49s Spring JDBC Template insert into emp(name,age,cdate)values('','',''),('','',''),('','',''),('','',''),('','','')
stmt.executeBatch();
 stmt  
4 https://www.cnblogs.com/xiandedanteng/p/11666521.html 32m47s Spring JDBC Template insert into emp(name,age,cdate)values('','','')
pstmt.executeBatch()
 prepared stmt  
5 https://www.cnblogs.com/xiandedanteng/p/11666169.html 40m24s Spring JDBC Template insert into emp(name,age,cdate)values('','','')
 stmt.executeBatch();
  stmt  
6 https://www.cnblogs.com/xiandedanteng/p/11663673.html  1h16m30s  MyBatis  insert into emp(name,age,cdate)values('','','')  估计为pstmt.execute(sql)  prepared stmt  

其它测试都在2019.10.12,2019.10.13的随笔中,请各位按日期查看。

最后可以得出结论如下:

提升插入记录效率最明显的,是采用一次插入多条这种方式,如#1,#2,#3所做的,它相对于单条插这种方式有数量级的提升,用时基本控制在五分钟左右。

至于其它如用executeBatch替换execute,用prepareStatement替换statement等,基本提升很小,几乎可以忽略不计

理由可以这样想,DB的实际处理能力是很强大的,一次插多条和一次插一条IO开销差不多,但前者明显充分调动了DB的处理能力,后者只动员了很少部分,相对于IO开销来说挺不值得,一累计差别就明显了。

以上测试所使用的程序都在 https://files.cnblogs.com/files/xiandedanteng/InsertMillionComparison20191013.rar 请各位自行下载。

 

标签:insert,Java,cnblogs,千万条,stmt,https,MySql,com,name
From: https://www.cnblogs.com/qsds/p/17647115.html

相关文章

  • java 批量插入数据
    转:https://blog.csdn.net/qq_35461948/article/details/130195282批量插入数据,常见的使用mybatisforeach插入的方式,原始的方式和批处理 1,常见的mybatisforeachxml<insertid="insertBatch"parameterType="java.util.List">insertintoCODEINFO(CODE_TY......
  • Java虚拟机规范
    来自GPT翻译,主要是找一些跟jvm指令与字节码相关的部分,来源:https://docs.oracle.com/javase/specs/jvms/se8/html/index.html2.5. Run-TimeDataAreasJava虚拟机定义了各种运行时数据区,这些数据区在程序执行期间使用。其中一些数据区在Java虚拟机启动时创建,并且只有在Java虚拟......
  • 软件安装_安装Mysql(启动服务、连接Mysql、修改临时密码)
         ......
  • Java学习IO流Day01
    io一、File2.1FIle概述File用来表示文件系统中的一个文件或者目录java.io包下2.2方法构造方法File(Stringpathname):通过指定路径名称创建一个新的FIle实例Filefile=newFile("D:\\demo.txt");File(Fileparent,Stringchild):根据父级目录对象和子文......
  • 软件安装_安装mysql
           ......
  • java中多线程使用方法
    线程互相独立可以同时运行一个线程不能多次启用并发和并行并发强调交替并行强调同时多线程实现方式继承Thread重写run方法下不能直接调用方法要调用start方法setname给线程命名getname获取线程名字实现Runnable接口先继承Runnable在创建Thread对象参......
  • mysql replace && insert && update && delete
    目录mysqlreplace&&insert&&update&&deletereplacemysqlreplace&&insert&&update&&deletereplace我们在使用数据库时可能会经常遇到这种情况。如果一个表在一个字段上建立了唯一索引,当我们再向这个表中使用已经存在的键值插入一条记录,那将会抛出一个主键冲突的......
  • JavaScript基础之基于数据类型和引用数据类型
    数据类型JavaScript的数据类型有7中,包括6个基本类型和一个引用类型基本数据类型:number,string,boolean,null,undefined,symbol引用数据类型:object(数组、对象、函数、正则等)基本数据类型和引用数据类型的区别存储方式基本类型:基本数据类型的值直接存储在改变量所分配的内存......
  • 《HTML CSS JavaScript 网页制作》JavaScript基本知识(简介、语法、事件、对象)
    一、JavaScript简介1、JavaScript特点脚本语言:是一种解释型的脚本语言,在程序运行过程中逐行进行解释;基于对象:可以创建对象,也能使用现有的对象;简单:采用的是弱类型的变量类型,对使用的数据类型未作出严格的要求;动态性:采用事件驱动,不需要经过web服务器就可以对用户的输入作出响应;跨平台......
  • 11 JavaScript关于时间
    11JavaScript关于时间获取js的时间使用内置的Date函数完成vard=newDate();//获取系统时间//vard=newDate('2023-08-1514:11:48');//得到一个具体时间console.log(d)//时间格式化year=d.getFullYear();//拿到年份month=d.getMonth()+1;/......