MySQL批量插入数据的几种方法

时间:2022-08-25 15:21:14

最近公司要求测试数据库的性能,就上网查了一些批量插入数据的代码,发现有好几种不同的用法,插入同样数据的耗时也有区别

别的先不说,先上一段代码与君共享

方法一:

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批量插入数据的几种方法的更多相关文章

  1. SQLServer 批量插入数据的两种方法

    SQLServer 批量插入数据的两种方法-发布:dxy 字体:[增加 减小] 类型:转载 在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Ins ...

  2. SQL 2005批量插入数据的二种方法

    SQL 2005批量插入数据的二种方法 Posted on 2010-07-22 18:13 moss_tan_jun 阅读(2635) 评论(2) 编辑 收藏 在SQL Server 中插入一条数据 ...

  3. MyBatis 批量插入数据的 3 种方法!

    批量插入功能是我们日常工作中比较常见的业务功能之一,之前我也写过一篇关于<MyBatis Plus 批量数据插入功能,yyds!>的文章,但评论区的反馈不是很好,主要有两个问题:第一,对 ...

  4. SQL Server 批量插入数据的两种方法

    在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题.下面介绍 SQL Server支持的两种批 ...

  5. SQL Server 批量插入数据的两种方法&lpar;转&rpar;

    此文原创自CSDN TJVictor专栏:http://blog.csdn.net/tjvictor/archive/2009/07/18/4360030.aspx 在SQL Server 中插入一条 ...

  6. 转:SQL Server 批量插入数据的两种方法

    在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题.下面介绍SQL Server支持的两种批量 ...

  7. mysql 批量插入数据过多的解决方法

    使用场景: 测试时需要插入100w的数据,跑sql脚本插入非常慢. 存储过程如下: //DELIMITER DROP PROCEDURE if EXISTS createAmountCount; cr ...

  8. 小白鼠排队(map容器插入数据的四种方法)

    题目描述 N只小白鼠(1 <= N <= 100),每只鼠头上戴着一顶有颜色的帽子.现在称出每只白鼠的重量,要求按照白鼠重量从大到小的顺序输出它们头上帽子的颜色.帽子的颜色用“red”,“ ...

  9. python使用MySQLdb向mySQL批量插入数据的方法

    该功能通过调用mySQLdb python库中的 cursor.executemany()函数完成批量处理. 今天用这个函数完成了批量插入 例程: def test_insertDB(options) ...

随机推荐

  1. 正则表达式30分钟入门:http&colon;&sol;&sol;deerchao&period;net&sol;tutorials&sol;regex&sol;regex&period;htm&num;mission

    http://deerchao.net/tutorials/regex/regex.htm#mission

  2. 【BZOJ】1270&colon; &lbrack;BeijingWc2008&rsqb;雷涛的小猫(DP&plus;水题)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1270 这完全是一眼题啊,但是n^2的时间挺感人.(n^2一下的级别请大神们赐教,我还没学多少dp优化 ...

  3. VS调试错误:&OpenCurlyDoubleQuote;没有可用于当前位置的源代码”的解决方案

    今天,有朋友在问为什么我在调试的时候会出现"没有可用于当前位置的源代码"的错误呢? MSDN上的说法:没有可用于当前位置的源代码,项目不包含您试图查看代码的源代码.原因通常是双击了 ...

  4. poj2749

    万变不离其宗 只要搞清楚题目的基本模型 搞清楚边是一种推导出的关系 搞清楚里面的逻辑关系 那就没什么难的了…… 二分+sat,没什么好说的 ; type node=record point,next: ...

  5. Objective-C基础笔记(5)Protocol

    Protocol简单来说就是一系列方法的列表,当中声明的方法能够被不论什么类实现.这中模式一般称为代理(delegation)模式. 在IOS和OS X开发中,Apple採用了大量的代理模式来实现MV ...

  6. Python使用Plotly绘图工具,绘制甘特图

    今天来讲一下如何使用Python 的绘图工具Plotly来绘制甘特图的方法 甘特图大家应该了解熟悉,就是通过条形来显示项目的进度.时间安排等相关情况的. 我们今天来学习一下,如何使用ployly来绘制 ...

  7. &lbrack;人工智能&rsqb; 安装python jupyter

    1.  什么是python jupyter ? 简单的说,可以理解为一个IDE. http://jupyter.org/ 2.  安装python jupyter notebook http://ju ...

  8. Docker:bash&colon; vi&colon; command not found

    在使用docker容器时,有时候里边没有安装vim,敲vim命令时提示说:vim: command not found,这个时候就需要安装vim 操作步鄹: 1.apt-get update 2.ap ...

  9. LeetCode 590 N-ary Tree Postorder Traversal 解题报告

    题目要求 Given an n-ary tree, return the postorder traversal of its nodes' values. 题目分析及思路 题目给出一棵N叉树,要求返 ...

  10. &lbrack;NOI2011&rsqb;阿狸的打字机——AC自动机之fail树的利用

    Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的 ...