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

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

我的数据表是这样的:

  1. CREATE TABLE `emp` (
  2. `Id` ) NOT NULL AUTO_INCREMENT,
  3. `name` ) DEFAULT NULL,
  4. `age` ) DEFAULT NULL,
  5. `cdate` timestamp NULL DEFAULT NULL COMMENT 'createtime',
  6. PRIMARY KEY (`Id`)
  7. ) ENGINE 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('','',''),('','',''),('','',''),('','',''),('','','')
  1. stmt.executeBatch();
 stmt  
4 https://www.cnblogs.com/xiandedanteng/p/11666521.html 32m47s Spring JDBC Template insert into emp(name,age,cdate)values('','','')
  1. pstmt.executeBatch()
 prepared stmt  
5 https://www.cnblogs.com/xiandedanteng/p/11666169.html 40m24s Spring JDBC Template insert into emp(name,age,cdate)values('','','')
  1. 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 请各位自行下载。

欢迎各位网友自行测试并评判。

--END--2019年10月13日15:40:15

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

  1. JDBC Java 程序从 MySQL 数据库中读取数据,并备份到 xml 文档中

    MySQL 版本:Server version: 5.7.17-log MySQL Community Server (GPL) 相关内容:JDBC Java 程序从 MySQL 数据库中读取数据,并 ...

  2. Java程序向MySql数据库中插入的中文数据变成了问号

    找到mysql的安装目录,修改my.ini文件 (1)如何找到my.ini文件 如果my.ini文件不在MySQL的安装目录下,可能放在隐藏目录,要先去找到ProgramData,(这里要先打开显示隐 ...

  3. java文件来演示如何访问MySQL数据库

    java文件来演示如何访问MySQL数据库. 注:在命令行或用一个SQL的前端软件创建Database. 先创建数据库: CREATE DATABASE SCUTCS; 接着,创建表: CREATE ...

  4. java连接mysql数据库增删改查操作记录

    1. 连接数据库.得到数据库连接变量 注意连接数据库的时候 (1)打开DB Browser 新建一个Database Driver,注意加入Driver JARs的时候加入的包,我的是mysql-co ...

  5. java jdbc使用SSH隧道连接mysql数据库demo

    java jdbc使用SSH隧道连接mysql数据库demo   本文链接:https://blog.csdn.net/earbao/article/details/50216999   packag ...

  6. java.sql.Date java.sql.Time java.sql.Timestamp 之比较

    java.sql.Date,java.sql.Time和java.sql.Timestamp 三个都是java.util.Date的子类(包装类). java.sql.Date是java.util.D ...

  7. 初学MyBatis(踩坑)Error querying database. Cause: java.sql.SQLException: java.lang.ClassCastException: java.math.BigInteger cannot be cast to java.lang.Long

    最近在学习Mybatis,代码全部根据教程写好了,一运行结果报了一个错误,主要错误内容: Caused by: org.apache.ibatis.exceptions.PersistenceExce ...

  8. linux自动定时备份web程序和mysql数据库

    前些天受朋友说linux定时备份不知道怎么搞,叫帮忙处理一下.由于这段时间正闲着,所以也就欣然答应.由于朋友对linux不懂也希望我将操作的过程记录下来,也就是越详细越好.所以写得比较$%^& ...

  9. 关于如何处理JSONObject.fromObject(Object obj)无法转换特殊日期(java.sql.Date,java.sql.Timestamp)格式的问题。

    转:关于如何处理JSONObject.fromObject(Object obj)无法转换特殊日期(java.sql.Date,java.sql.Timestamp)格式的问题. 关于JSONObje ...

随机推荐

  1. Oracle 数据 查询 一对多 取最新一条非 0 数据

    主键id     待查字段     日期 1            6             2019/5/1 1            0             2019/5/2 需求: 找出 ...

  2. 关于zsh在使用scp时报错zsh: no matches found: scp

    root@banxia:scp root@172.16.13.150:/123/* . zsh: no matches found: root@172.16.13.150:/123/* root@ba ...

  3. C语言判断一个32位的数据,有多少位是1,然后用串口发送出来

    今天遇到了一个问题,遇到一个32位的数据,写一个子函数来判断它的多少位是1.我的思路一开始是把这个数据变成一个32位容量的数组然后每个位去比较是不是1,如果是1,就用另一个变量加1.最后返回这个变量. ...

  4. RT-Thread--时间管理

    时钟节拍 时钟节拍是特定的周期中断,可以看是系统心跳,中断之间的时间间隔取决于不同的应用,一般是 1ms–100ms,时钟节拍率越快,系统的额外开销就越大,从系统启动开始计数的时钟节拍数称为系统时间. ...

  5. idou老师教你学Istio 29:Envoy启动流程

    1. 功能概述 Envoy启动时,会启动一个进程,并在这个进程中启动很多线程,这样,可以启动很多worker线程,一般worker线程数与核心数相同,每个worker线程处理所有已配置的listene ...

  6. java 接口方法超时异常处理 设置超时时间

    原文:https://blog.csdn.net/coding_1994/article/details/87728374 使用线程池另起一个线程,可以使用  newFixedThreadPool() ...

  7. editplus多行合并成一行

    原文:https://www.cnblogs.com/jpfss/p/9238877.html Editplus 合并行快捷键: Ctrl+Shift+J     ,选中要合并的行,再按快捷键即可

  8. nagios安装部署及详细配置说明(转)

    一.Nagios简介 Nagios是一款开源的电脑系统和网络监视工具,能有效监控Windows.Linux和Unix的主机状态,交换机路由器等网络设置,打印机等.在系统或服务状态异常时发出邮件或短信报 ...

  9. Python基础之类

    一.摘要 面向对象编程 是最有效的软件编写方法之一.在面向对象编程中,你编写表示现实世界中的事物和情景的类,并基于这些类来创建对象.编写类时,你定义一大类对象都有的通用行为.基于类创建对象 时,每个对 ...

  10. Css案例整理

    1.实现两个div并排显示 案例:checkbox的标题和内容需要并排显示,checkbox竖向排列 <head> <style type="text/css"& ...