平时使用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批量插入数据的效率的更多相关文章

  1. JDBC批量插入数据优化,使用addBatch和executeBatch

    JDBC批量插入数据优化,使用addBatch和executeBatch SQL的批量插入的问题,如果来个for循环,执行上万次,肯定会很慢,那么,如何去优化呢? 解决方案:用 preparedSta ...

  2. 向mysql中批量插入数据的性能分析

    MYSQL批量插入数据库实现语句性能分析 假定我们的表结构如下 代码如下   CREATE TABLE example (example_id INT NOT NULL,name VARCHAR( 5 ...

  3. JDBC批量插入数据效率分析

    对于需要批量插入数据库操作JDBC有多重方式,本利从三个角度对Statement和PreparedStatement两种执行方式进行分析,总结较优的方案. 当前实现由如下条件: 执行数据库:Mysql ...

  4. Mysql优化批量插入数据

    最近为了测试项目,需要在Mysql中插入百万级测试数据,于是用到了批量插入,自己写了个简单的Spring Cloud项目. 开始时执行效率很慢,大概100条/秒,批次的大小也试过1000,2000,5 ...

  5. php如何在mysql里批量插入数据

    假如说我有这样一个表,我想往这个表里面插入大量数据 CREATE TABLE IF NOT EXISTS `user_info` ( `id` int(11) NOT NULL AUTO_INCREM ...

  6. jmeter连接mysql数据库批量插入数据

    前提工作: 1.在jmeter官网下载jmeter包(官网地址:https://jmeter.apache.org/).此外还需下载mysql驱动包,如:mysql-connector-java-5. ...

  7. 使用存储过程在mysql中批量插入数据

    一.在mysql数据库中创建一张表test DROP TABLE IF EXISTS `test`; CREATE TABLE `test` ( `id` INT (11), `name` VARCH ...

  8. MySQL中批量插入数据

    不管怎么样, 你需要大量的数据, 那么问题来了, 怎么快速地插入呢? 1. 这是我创建的一个批量插入的存储过程… 当然, 你可以把参数去掉, 一次性插入1W, 10W… CREATE DEFINER= ...

  9. 【实践】jdbc批量插入数据

    参考文献:http://my.oschina.net/u/1452675/blog/203670 http://superjavason.iteye.com/blog/255423 /*测试批量写入数 ...

随机推荐

  1. 10、基本数据类型(set)

    10.1.集合: 1.集合元素用大括号括起来,用逗号分割每个元素 2.集合的特点: (1)集合元素的数据类型只能是不可变数据类型,"列表"."字典"." ...

  2. 探究国内CRM系统哪家公司做的最好?

    国内CRM系统哪家公司做的最好?相信这是很多人关心的话题.但这是一个伪命题,因为无论什么产品,都没有一个确定的结论来证明哪个产品最好.我们只能根据它的功能.适用性.价格等来判断哪个最合适.所以小编只能 ...

  3. MPP大规模并行处理架构详解

    面试官:说下你知道的MPP架构的计算引擎? 这个问题不少小伙伴在面试时都遇到过,因为对MPP这个概念了解较少,不少人都卡壳了,但是我们常用的大数据计算引擎有很多都是MPP架构的,像我们熟悉的Impal ...

  4. IDEA中Springboot启动热部署

    在IDEA中开发springboot项目时,每次修改代码后都需要手动重启项目比较麻烦,可以通过添加一定的配置使每次修改代码后项目进行自动重启 在IDEA中开发springboot项目时,每次修改代码后 ...

  5. CentOS-yum安装Nginx

    查看系统版本 $ cat /etc/redhat-release Nginx 不在默认的 yum 源中,使用官网的 yum 源 $ rpm -ivh http://nginx.org/packages ...

  6. phpredis中文手册

    本文是参考<redis中文手册>,将示例代码用php来实现,注意php-redis与redis_cli的区别(主要是返回值类型和参数用法). 目录(使用CTRL+F快速查找命令): Key ...

  7. varnish配置语言(2)

    目录 1. Backend servers 2. 多个后端 3. Varnish 中的后端服务器和虚拟主机 4. 调度器 5. 健康检查 6. Hashing 7. 优雅模式 Grace mode 和 ...

  8. Servlet核心技术

    一.基本概念 1.C/S C/S架构是客户端服务器架构,将需要处理的业务合理的分配到客户端和服务器,客户端负责与用户的交互任务,服务器负责数据管理. 优点: 客户端界面和功能可以很丰富 应用服务器负荷 ...

  9. Day8 方法详解及递归思想.

    何为方法 Java方法是语句的集合,它们在一起执行一个功能. 方法是解决一类问题步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 设计方法的原则: 方法的本意是功能块,就是实 ...

  10. 【开发工具】-- IDEA集成Git在实际项目中的运用

    1.企业实际项目中Git的使用 在实际的企业项目开发中,我们一般Java的项目在公司都有自己的局域网代码仓库,仓库上存放着很多的项目.以我工作过的公司如华为的项目,一般是存放在企业内部的CodeHub ...