MySQL:JDBC批量插入数据的效率
平时使用mysql插入、查询数据都没有注意过效率,今天在for循环中使用JDBC插入1000条数据居然等待了一会儿
就来探索一下JDBC的批量插入语句对效率的提高
首先进行建表
create table `user1`(
`id` int primary key auto_increment,
`phoneNumber` int not null ,
`indentity` int not null ,
`address` varchar(100),
index (id,phoneNumber,indentity)
)engine =innoDB default charset = utf8mb4;
- 这里使用了一个组合索引,会降低插入数据的效率,应该就是我插入1000条数据都会感觉慢的主要原因
- 存储引擎是innoDB,据说MyISAM插入数据会更快
JDBC操作数据库
使用的是MySql8.0
Class.forName("com.mysql.cj.jdbc.Driver");
//不需要建立 SSL 连接,需要显示关闭。
//allowPublicKeyRetrieval=true 允许客户端从服务器获取公钥。
//时区为UTC
String dburl = "jdbc:mysql://localhost:3306/myTest?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
String username = "root";
String password = "123456";
Connection connection = DriverManager.getConnection(dburl,username,password);
PreparedStatement的批量插入
String sql = "insert into `user1`(`phoneNumber`, `indentity`, `address`) values (?,?,?)";
PreparedStatement preparedStatement = connection.prepareStatement(sql); Date date = new Date();
System.out.println(date.toString()); for (int i = 1000; i < 2000; i++) {
preparedStatement.setInt(1,i+2);
preparedStatement.setInt(2,i+101);
preparedStatement.setString(3,"dizhi");
preparedStatement.addBatch();
}
preparedStatement.executeBatch();
运行结果显示出,插入1000条数据只用了16秒
for循环暴力插入数据
Date date = new Date();
System.out.println(date.toString()); for (int i = 4000; i < 5000; i++) {
preparedStatement.setInt(1,i+2);
preparedStatement.setInt(2,i+101);
preparedStatement.setString(3,"dizhi");
preparedStatement.execute();
}
Date date1 = new Date();
System.out.println(date1.toString());
运行结果显示用了17秒,用for循环插入和批量插入用的时间差距并不大的,这明显有问题,所以进行第二次批量插入查询
然后进行第二次批量插入实验(其实是先第二次批量插入再用的暴力for)
Date date = new Date();
System.out.println(date.toString());
//
for (int i = 3000; i < 4000; i++) {
preparedStatement.setInt(1,i+2);
preparedStatement.setInt(2,i+101);
preparedStatement.setString(3,"dizhi");
preparedStatement.addBatch();
}
Date date1 = new Date();
System.out.println(date1.toString());
结果很神奇,第二次批量插入立即完成,完全没有延迟
具体原因还需要多多百度,我猜测是MySQL缓存的作用,省去了很多交互过程,减少了网络传输
第三次批量插入数据
现在距离第二次已经过去了很长时间,这次测试是想看看MySQL缓存还在不在
Date date = new Date();
System.out.println(date.toString());
for (int i = 5000; i < 6000; i++) {
preparedStatement.setInt(1,i+2);
preparedStatement.setInt(2,i+101);
preparedStatement.setString(3,"dizhi");
preparedStatement.addBatch();
}
preparedStatement.executeBatch();
Date date1 = new Date();
System.out.println(date1.toString());
显然,又是16秒,看来是时间过去太久了
总的来说,MySQL是真个神奇的玩意
MySQL:JDBC批量插入数据的效率的更多相关文章
- JDBC批量插入数据优化,使用addBatch和executeBatch
JDBC批量插入数据优化,使用addBatch和executeBatch SQL的批量插入的问题,如果来个for循环,执行上万次,肯定会很慢,那么,如何去优化呢? 解决方案:用 preparedSta ...
- 向mysql中批量插入数据的性能分析
MYSQL批量插入数据库实现语句性能分析 假定我们的表结构如下 代码如下 CREATE TABLE example (example_id INT NOT NULL,name VARCHAR( 5 ...
- JDBC批量插入数据效率分析
对于需要批量插入数据库操作JDBC有多重方式,本利从三个角度对Statement和PreparedStatement两种执行方式进行分析,总结较优的方案. 当前实现由如下条件: 执行数据库:Mysql ...
- Mysql优化批量插入数据
最近为了测试项目,需要在Mysql中插入百万级测试数据,于是用到了批量插入,自己写了个简单的Spring Cloud项目. 开始时执行效率很慢,大概100条/秒,批次的大小也试过1000,2000,5 ...
- php如何在mysql里批量插入数据
假如说我有这样一个表,我想往这个表里面插入大量数据 CREATE TABLE IF NOT EXISTS `user_info` ( `id` int(11) NOT NULL AUTO_INCREM ...
- jmeter连接mysql数据库批量插入数据
前提工作: 1.在jmeter官网下载jmeter包(官网地址:https://jmeter.apache.org/).此外还需下载mysql驱动包,如:mysql-connector-java-5. ...
- 使用存储过程在mysql中批量插入数据
一.在mysql数据库中创建一张表test DROP TABLE IF EXISTS `test`; CREATE TABLE `test` ( `id` INT (11), `name` VARCH ...
- MySQL中批量插入数据
不管怎么样, 你需要大量的数据, 那么问题来了, 怎么快速地插入呢? 1. 这是我创建的一个批量插入的存储过程… 当然, 你可以把参数去掉, 一次性插入1W, 10W… CREATE DEFINER= ...
- 【实践】jdbc批量插入数据
参考文献:http://my.oschina.net/u/1452675/blog/203670 http://superjavason.iteye.com/blog/255423 /*测试批量写入数 ...
随机推荐
- imply套件以及plyql的安装
本文出自:http://www.cnblogs.com/gaojiang/p/7212149.html 1.安装nodejs,版本需要在4.0以上,安装方法见上篇博客 2.下载imply,地址:htt ...
- 简单聊一下Uwsgi和Django的爱恨情仇
项目目录:/root/app Uwsgi的配置文件 [uwsgi] # Python扩展包安装的地方 pythonpath=/usr/local/src/python3/lib/python3.5/s ...
- 学前端的第一门语言HTML
学前端最终要做的就是制作各种各样的网页,html就相当于网页的骨架,所以我们学习前端的第一步就是先学html,接下来学习什么是html. 什么是HTML? HTML指的是超文本标记语言(Hyper T ...
- 高校表白App-团队冲刺第五天
今天要做什么 封装Adapter制作引导页 今天做了什么 成功封装工具类,为以后的轮播做了铺垫 遇到的问题 在封装时采用数组容器进行操作,只能添加图片作为元素,对于layout不可加入
- [刘阳Java]_CSS普通菜单制作
简单给大家介绍一下CSS普通菜单制作,先看图 功能很简单 UL制作菜单 鼠标进入LI的CSS伪类,实现菜单弹出效果 源码如下 <!DOCTYPE html> <html> &l ...
- 使用pymysql循环删除重复数据,并修改自增字段偏移值
创建表: CREATE TABLE `info` ( `id` tinyint NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, PRIMAR ...
- 怀疑前端组件把我的excel文件搞坏了,怎么证明
背景 我在做个需求,用户通过excel上传文件,文件中,每一行就是一条数据,后台批量处理:但是呢,用户填的数据可能有问题,所以我后台想先做个检查,然后在每一行中加一列,来指出这一行存在的问题. 我本来 ...
- js实现0ms延时定时器的几种方式
这两天看到一篇介绍<如何实现准时的 setTimeout?>的文章,文章起源于一道面试题:有什么办法让setTimeout准时呀?具体文章内容可查看附录[1],看完之后,引起了我对setT ...
- P5110 块速递推-光速幂、斐波那契数列通项
P5110 块速递推 题意 多次询问,求数列 \[a_i=\begin{cases}233a_{i-1}+666a_{i-2} & i>1\\ 0 & i=0\\ 1 & ...
- jvm源码解读--18 Java的start()方法解读 以及 wait 和notify流程图
drawwed by 张艳涛 and get info from openjdk8 还有一个图