【java】[sql]使用Java程序向MySql数据库插入一千万条记录,各种方式的比较,最后发现insert批量插入方式对效率提升最明显
我的数据库环境是mysql Ver 14.14 Distrib 5.6.45, for Linux (x86_64) using EditLine wrapper
这个数据库是安装在T440p的虚拟机上的,操作系统为CentOs6.5.
我的数据表是这样的:
CREATE TABLE `emp` ( `Id` ) NOT NULL AUTO_INCREMENT, `name` ) DEFAULT NULL, `age` ) DEFAULT NULL, `cdate` timestamp NULL DEFAULT NULL COMMENT 'createtime', PRIMARY KEY (`Id`) ) 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('','',''),('','',''),('','',''),('','',''),('','','') |
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 请各位自行下载。
欢迎各位网友自行测试并评判。
--END--2019年10月13日15:40:15
【java】[sql]使用Java程序向MySql数据库插入一千万条记录,各种方式的比较,最后发现insert批量插入方式对效率提升最明显的更多相关文章
- JDBC Java 程序从 MySQL 数据库中读取数据,并备份到 xml 文档中
MySQL 版本:Server version: 5.7.17-log MySQL Community Server (GPL) 相关内容:JDBC Java 程序从 MySQL 数据库中读取数据,并 ...
- Java程序向MySql数据库中插入的中文数据变成了问号
找到mysql的安装目录,修改my.ini文件 (1)如何找到my.ini文件 如果my.ini文件不在MySQL的安装目录下,可能放在隐藏目录,要先去找到ProgramData,(这里要先打开显示隐 ...
- java文件来演示如何访问MySQL数据库
java文件来演示如何访问MySQL数据库. 注:在命令行或用一个SQL的前端软件创建Database. 先创建数据库: CREATE DATABASE SCUTCS; 接着,创建表: CREATE ...
- java连接mysql数据库增删改查操作记录
1. 连接数据库.得到数据库连接变量 注意连接数据库的时候 (1)打开DB Browser 新建一个Database Driver,注意加入Driver JARs的时候加入的包,我的是mysql-co ...
- java jdbc使用SSH隧道连接mysql数据库demo
java jdbc使用SSH隧道连接mysql数据库demo 本文链接:https://blog.csdn.net/earbao/article/details/50216999 packag ...
- 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 ...
- 初学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 ...
- linux自动定时备份web程序和mysql数据库
前些天受朋友说linux定时备份不知道怎么搞,叫帮忙处理一下.由于这段时间正闲着,所以也就欣然答应.由于朋友对linux不懂也希望我将操作的过程记录下来,也就是越详细越好.所以写得比较$%^& ...
- 关于如何处理JSONObject.fromObject(Object obj)无法转换特殊日期(java.sql.Date,java.sql.Timestamp)格式的问题。
转:关于如何处理JSONObject.fromObject(Object obj)无法转换特殊日期(java.sql.Date,java.sql.Timestamp)格式的问题. 关于JSONObje ...
随机推荐
- Linux的关机和重启命令
Linux有如下的关机和重启命令:shutdown, reboot, halt, poweroff,那么它们有什么区别呢? shutdown - 建议使用的命令 shutdown是最常用也是最安全的关 ...
- sql复杂的子查询,横向合并结果集
第一个查询的结果集 select * from( select c.msName,a.msId,c.msPrice, c.msPrice*COUNT(a.msId) as totalMoney,sum ...
- B+树Java代码实现以及测试
M阶B+树的定义: 任意非叶子结点最多有M个子节点:且M>2: 除根结点以外的非叶子结点至少有 M/2个子节点: 根结点至少有2个子节点: 除根节点外每个结点存放至少M/2和至多M个关键字:(至 ...
- CrawlSpider ---> 通用爬虫 项目流程
通用爬虫 通用网络爬虫 从互联网中搜集网页,采集信息,这些网页信息用于为搜索引擎建立索引从而提供支持,它决定着整个引擎系统的内容是否丰富,信息是否即时,因此其性能的优劣直接影响着搜索引擎的效果. 不扯 ...
- less避免编译
less里面有一个避免编译,有时候我们需要输出一些不正确的css语法或者使用less不认识的专有语法.要输出这样的值我们可以在字符串前加上一个~ /*避免编译*/ .test_03{ width: 3 ...
- 出现 “java”不是内部或外部命令,也不是可运行程序或批处理文件的问题
用cmd运行测试下springboot入门案例,没想到出现了如下图这一幕 我电脑环境配置从来没改动过,网上查了下没搜到错误的结果. 可能的情况就是: 安装其他程序的时候,path变量被修改了,导致ja ...
- flask例子
1.例子: https://blog.csdn.net/z564359805/article/details/83474387 def get_embedding(bc,query_list,ba ...
- Vue-Cli3.0 单页面如何预渲染,解决登录拦截导致无法部分路由无法预渲染问题?
vue单页面不利于seo,如何解决已有spa项目seo问题? 1.安装 cnpm install prerender-spa-plugin --save-dev 2.路由history模式 const ...
- Java基础 static限定符的使用 以及【 static实现的 singleton(单例)设计模式】
static实现的 singleton(单例)设计模式 /** static实现的 singleton设计模式 , 使得一个类只能够创建一个static对象 */ 模板设计结构: package Co ...
- 《流畅的Python》 Sequence Hacking, Hashing and Slicing(没完成)
序列修改,散列和切片 基本序列协议:Basic sequence protocol: __len__ and __getitem__ 本章通过代码讨论一个概念: 把protocol当成一个正式接口.协 ...