mysql大批量插入数据的正确解决方法

 更新时间:2023年09月18日 09:35:18   作者:赵广陆  
这篇文章主要介绍了mysql大批量插入数据的正确做法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

1 批量插入和单条插入比较

如何快速的向数据库中插入已知的1000万条数据

​ 假设这1000W条数据在同一个集合里,那么将这个集合进行遍历,循环1000W次,结合数据库编程技术,如JDBC,就可以插入数据库,这么简单的操作,显然不是正确答案…

List<User> list = findAllUser();
Statement stat = conn.createStatement();
for (User u : list) {
	String sql = "INSERT INTO t_user (uname,age,email) VALUE ('"
                  +u.getUsername()+"',"+u.getAge()+",'"+u.getEmail()+"')";
	stat.addBatch(sql);
}
stat.executeBatch();
INSERT INTO t_user
      (uname,upwd,age,email)
VALUE 
      ('root1','123456',15,'root111@qq.com'),
      ('root2','123456',18,'root222@qq.com'),
      ('root3','123456',26,'root333@qq.com'),
      ....

​ 当两种方法配合使用,可以使用每条SQL语句插入100条数据,批处理每次发送1000条这样的数据,共循环100次即可。​ 理论上来说,批处理操作不建议一次性超过【5000】,每条SQL语句根据具体需求调整,不建议超过【100】,可以调整循环次数来改善效率。

下面为测试代码:

1.1 测试普通插入

@Test
public void testInsert() {
	UserDAO dao = new UserDAO();
	long t1 = System.currentTimeMillis();
	for(int i=0;i<10000000;i++) {
	    dao.insert(
                "INSERT INTO t_user (uname,pwd,age,email) VALUES ('root','123',15,'root@qq.com')");
	}
	long t2 = System.currentTimeMillis();
	int time = (int) ((t2-t1)/1000);
	System.out.println("共耗时:" + time +"秒")
}

测试结果:在尝试了几次,都被各种意外打断之后,我决定没有必要把数据全部插完,因为实在是太多了,不多说,上图吧

在这里插入图片描述

1.2 测试批处理配合拼接SQL语句插入

@Test
public void testBatch() throws SQLException {
	Connection conn = DBUtils.getConn();
	Statement stat = conn.createStatement();
long t1 = System.currentTimeMillis();
	for(int k=0;k<100;k++) {
	for (int i=0;i<1000;i++) {
			StringBuilder sql =new StringBuilder();
			sql.append("INSERT INTO t_user (uname,pwd,age,email) VALUES ");
			for (int j = 0; j < 100; j++) {				sql.append("('root','123',15,'root@qq.com'),");
			}
			stat.addBatch(sql.toString().substring(0,sql.lastIndexOf(",")))
		}
		stat.executeBatch();
	}
	long t2 = System.currentTimeMillis();
	int time = (int) ((t2-t1)/1000);
	System.out.println("共耗时:" + time +"秒");
}

测试结果:

img

结果显而易见了:第二种方案的执行效率远高于普通插入方法,不过,具体运行时间和电脑配置应该也有关系的,所以不用纠结时间长短,还是会用高效的方法就好了。

2 原理探究

应用服务器(程序运行所在服务器)与MySQL数据库服务器并不是同一台,当需要执行数据库操作时,会由应用服务器将SQL语句发送到MySQL数据库服务器,发送过程中就需要建立网络连接,才可以发送SQL语句,则总共需要连接1000W次,效率极低。

同时,每次执行SQL语句之前,MySQL服务器还会对SQL语句进行语法分析,语义分析,编译检查等才可以执行,假设最终有1000W条SQL语句,则这些过程需要耗费大量时间。针对这个缺陷,

可以使用【批处理】解决,减少连接数据库的次数,同时将单条插入语句改为一次插入多条数据以提高效率。

到此这篇关于mysql大批量插入数据的正确做法的文章就介绍到这了,更多相关mysql大批量插入数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL中在查询结果集中得到记录行号的方法

    MySQL中在查询结果集中得到记录行号的方法

    这篇文章主要介绍了MySQL中在查询结果集中得到记录行号的方法,本文解决方法是通过预定义用户变量来实现,需要的朋友可以参考下
    2015-01-01
  • mysql实现表内增加一个字段并赋值

    mysql实现表内增加一个字段并赋值

    这篇文章主要介绍了mysql实现表内增加一个字段并赋值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • MySQL数据库JDBC编程详解流程

    MySQL数据库JDBC编程详解流程

    JDBC是指Java数据库连接,是一种标准Java应用编程接口( JAVA API),用来连接 Java 编程语言和广泛的数据库。从根本上来说,JDBC 是一种规范,它提供了一套完整的接口,允许便携式访问到底层数据库,本篇文章我们来了解MySQL连接JDBC的流程方法
    2022-01-01
  • Linux下安装mysql-5.6.4 的图文教程

    Linux下安装mysql-5.6.4 的图文教程

    在开始安装前,先说明一下mysql-5.6.4与较低的版本在安装上的区别,从mysql-5.5起,mysql源码安装开始使用cmake了,因此当我们配置安装目录./configure --perfix=/.....的时候和以前的会有些区别,这点我们稍后会提到
    2013-06-06
  • mysql binlog日志查询不出语句问题及解决

    mysql binlog日志查询不出语句问题及解决

    这篇文章主要介绍了mysql binlog日志查询不出语句问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 详解MySQL中的死锁情况以及对死锁的处理方法

    详解MySQL中的死锁情况以及对死锁的处理方法

    这篇文章主要介绍了详解MySQL中的死锁情况以及对死锁的处理方法,文中主要讨论InnoDB存储引擎中的死锁情况,需要的朋友可以参考下
    2016-01-01
  • Mysql5 字符集编码问题解决

    Mysql5 字符集编码问题解决

    mysql 创建 数据库时指定编码很重要,很多开发者都使用了默认编码,但是我使用的经验来看,制定数据库的编码可以很大程度上避免倒入导出带来的乱码问题。
    2009-10-10
  • mysql中的日期相减的天数函数

    mysql中的日期相减的天数函数

    这篇文章主要介绍了mysql中的日期相减的天数函数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • mysql中update按照多重条件进行更新处理的方案

    mysql中update按照多重条件进行更新处理的方案

    更新数据是使用数据库时最重要的任务之一,下面这篇文章主要给大家介绍了关于mysql中update按照多重条件进行更新处理的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • MySQL数据库基础学习之JSON函数各类操作详解

    MySQL数据库基础学习之JSON函数各类操作详解

    很多日常业务场景都会用到json文件作为数据存储起来,而mysql5.7以上就提供了存储json的支撑。这篇文章就为大家整理了MySQL中JSON函数的各类操作,感兴趣的可以了解一下
    2023-02-02

最新评论