当前位置:   article > 正文

mysql大批量插入数据的正确做法_mysql一次性添加多条数据

mysql一次性添加多条数据


想学习架构师构建流程请跳转:Java架构师系统架构设计
在这里插入图片描述

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')....
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

​ 当两种方法配合使用,可以使用每条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
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

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

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 +"秒");

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

测试结果:
img

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

2 原理探究

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/程序代码艺术家/article/detail/61846
推荐阅读
相关标签
  

闽ICP备14008679号