MySQL批量插入数据的几种方法
最近公司要求测试数据库的性能,就上网查了一些批量插入数据的代码,发现有好几种不同的用法,插入同样数据的耗时也有区别
别的先不说,先上一段代码与君共享
方法一:
package com.bigdata; import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.PreparedStatement; public class TestBigData { /**
* @param args
* @throws Exception
* @throws IllegalAccessException
* @throws InstantiationException
*/
public static void main(String[] args) throws Exception {
//--------------------------------连接数据库----------------------
String driver="com.mysql.jdbc.Driver";
String url="jdbc:mysql://127.0.0.1:3306/test";
String user="root";
String password="root"; //1、新建驱动
Driver driverInstance = (Driver) Class.forName(driver).newInstance();
//2、注册驱动
DriverManager.registerDriver(driverInstance);
//3、获取连接
Connection conn = DriverManager.getConnection(url, user, password); //----------------------对数据库进行操作-------------------
//记录开始时间
Long begin=System.currentTimeMillis();
//-----------插入数据----------
//sql语句前缀
String sqlPre="insert into tb_big_db (count,create_time,random) values ";
StringBuffer sb = new StringBuffer();
//设置事务为非自动提交
conn.setAutoCommit(false);
//使用PrepareStatement更好
PreparedStatement pstate = conn.prepareStatement(""); //--------------------------十万条数据-------------
//设置外循环,总提交事务的次数
for(int i=0;i<100;i++){
for(int j=0;j<10000;j++){
//构建sql后缀
sb.append("("+j*i+",SYSDATE(),"+i*j*Math.random()+"),");
}
//构建完整的sql
String sql = sqlPre + sb.substring(0, sb.length()-1);
//添加sql
pstate.addBatch(sql);
//执行sql
pstate.executeBatch();
//提交事务
conn.commit();
//清空StringBuffer上一次添加的sql语句
sb = new StringBuffer();
}
//大循环完毕,关闭连接
pstate.close();
conn.close();
//结束时间
Long end = System.currentTimeMillis();
System.out.println("10万条数据,插入数据库耗时:"+(end-begin)+"ms");
} }
耗时:1952ms
说明:这速度,不堪入目啊,公司的数据库,不管从硬件还是软件来看,都不行呐。
方法二:
package com.bigdata; import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.PreparedStatement; public class TestBigData2 { public static void main(String[] args) throws Exception{
//--------------------------------连接数据库----------------------
String driver="com.mysql.jdbc.Driver";
String url="jdbc:mysql://127.0.0.1:3306/test";
String user="root";
String password="root"; //1、新建驱动
Driver driverInstance = (Driver) Class.forName(driver).newInstance();
//2、注册驱动
DriverManager.registerDriver(driverInstance);
//3、获取连接
Connection conn = DriverManager.getConnection(url, user, password); //-----------------------------------操作数据库-----------------
//记录开始时间
Long begin = System.currentTimeMillis(); //动态sql语句
String sql = "insert into tb_big_db (count,create_time,random) values (?,SYSDATE(),?)";
//设置事务为非自动提交
conn.setAutoCommit(false);
//预编译sql
PreparedStatement pstate = conn.prepareStatement(sql);
//外循环10次
for(int i=0;i<10;i++){
//内循环10000次
for(int j=0;i<1000;j++){
pstate.setLong(1, i*j);
pstate.setLong(2, i*j);
//添加到批处理上
pstate.addBatch();
}
//批处理
pstate.executeBatch();
//提交
conn.commit();
}
//关闭
pstate.close();
conn.close();
//结束时间
Long end = System.currentTimeMillis();
System.out.println("插入10万条数据,耗时:"+(end-begin)+"ms");
}
}
耗时:未知,原因是我用这个方法测试的时候,居然给我报内存溢出异常,说明这个方法需要的内存大,耗时高,所以我和上面的方法一做了个对比。
由于2个方法都用来prepareStatement类,该类在执行sql语句之前会对其进行预编译,就是说先把sql准备好先,用到的时候就直接用就可以了
方法一:通过代码分析,可以明显看到,方法一种的sql语句通过拼接成10条sql语句,故数据库执行语句时,只要执行10条就好
方法二:可以看出,它每循环一次,就要addBach()一次,速度变得更加慢,有10000条就addBatch()一万次,再批处理10次,所以速度变得慢是理所当然的
MySQL批量插入数据的几种方法的更多相关文章
- SQLServer 批量插入数据的两种方法
SQLServer 批量插入数据的两种方法-发布:dxy 字体:[增加 减小] 类型:转载 在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Ins ...
- SQL 2005批量插入数据的二种方法
SQL 2005批量插入数据的二种方法 Posted on 2010-07-22 18:13 moss_tan_jun 阅读(2635) 评论(2) 编辑 收藏 在SQL Server 中插入一条数据 ...
- MyBatis 批量插入数据的 3 种方法!
批量插入功能是我们日常工作中比较常见的业务功能之一,之前我也写过一篇关于<MyBatis Plus 批量数据插入功能,yyds!>的文章,但评论区的反馈不是很好,主要有两个问题:第一,对 ...
- SQL Server 批量插入数据的两种方法
在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题.下面介绍 SQL Server支持的两种批 ...
- SQL Server 批量插入数据的两种方法(转)
此文原创自CSDN TJVictor专栏:http://blog.csdn.net/tjvictor/archive/2009/07/18/4360030.aspx 在SQL Server 中插入一条 ...
- 转:SQL Server 批量插入数据的两种方法
在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题.下面介绍SQL Server支持的两种批量 ...
- mysql 批量插入数据过多的解决方法
使用场景: 测试时需要插入100w的数据,跑sql脚本插入非常慢. 存储过程如下: //DELIMITER DROP PROCEDURE if EXISTS createAmountCount; cr ...
- 小白鼠排队(map容器插入数据的四种方法)
题目描述 N只小白鼠(1 <= N <= 100),每只鼠头上戴着一顶有颜色的帽子.现在称出每只白鼠的重量,要求按照白鼠重量从大到小的顺序输出它们头上帽子的颜色.帽子的颜色用“red”,“ ...
- python使用MySQLdb向mySQL批量插入数据的方法
该功能通过调用mySQLdb python库中的 cursor.executemany()函数完成批量处理. 今天用这个函数完成了批量插入 例程: def test_insertDB(options) ...
随机推荐
- 【Selenium】【BugList8】126邮箱定位不到“退出”按钮:Message: TypeError: can't access dead object
[流程描述] 登录126邮箱,退出 [代码] #coding=utf-8 from selenium import webdriver driver = webdriver.Firefox() #dr ...
- JAVA经典算法50题(转)
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/51097928 JAVA经典算法50题 [程序1] 题目:古典问题:有一对兔子, ...
- k8s storageClass对接nfs
前提:已存在一个nfs服务 192.168.137.11:/home/nfs_data 下面以rbac方式对接nfs 1.创建/root/k8s-nfs-rbac/serviceaccount.yam ...
- bootstrap table使用参考
https://www.cnblogs.com/landeanfen/p/5821192.html 转载 阅读目录 一.x-editable组件介绍 二.bootstrapTable行内编辑初始方案 ...
- Catalog
Java SE EE| Hibernate | Struts2Spring/SpringMVC | MyBatis C# Python PHP C/C++ | STL 汇编语言 ...
- 【转】在Linux下安装python3
原文链接:http://www.cnblogs.com/feng18/p/5854912.html 1.linux下安装python3 a. 准备编译环境(环境如果不对的话,可能遇到各种问题,比如wg ...
- 常用的头文件—— common.h
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/sta ...
- Using iSCSI On Ubuntu 10.04 (Initiator And Target)
This guide explains how you can set up an iSCSI target and an iSCSI initiator (client), both running ...
- JSP Ueditor 实现图片跨域上传
Ueditor的单图上传,在官方文档上明确写了不支持 然后通过百度找了许多方案,终于有一个可以解决了. http://www.cnblogs.com/hpnet/p/6290452.html 不过那个 ...
- Java 使用 Map 实现缓存工具
以下代码参考于网上,做了小部分修改. 该代码实现了定时清除临时缓存的功能. 缓存管理类 package com.wbproject.util.cache; import java.time.Local ...