mysql批量插入数据

review代码发现,同事mysql批量插入数据的实现方法是,用for循环遍历,将列表每个数据单次插入。相当于批量插入N条数据,进行了n次的数据库连接和插入操作。

底层有批量插入的方法,但是会有问题,所以已经停用,看下面实现是,取到一个数据库连接,来处理后面所有的插入操作。若这个列表ops所有的sql语句执行的数据库都是同一个的话,就没什么问题,若里面存在散库的情况,只要跟第一个不在同一个库的,都会执行失败。

 public void insertBatch(List<OpBatchUpdate> ops) throws SQLException {
        if(ops != null && ops.size() != 0) {
            OpBatchUpdate firstOp = (OpBatchUpdate)ops.get(0);
            if(firstOp.bizName != null && firstOp.bizName.trim().length() != 0) {
                PreparedStatement ps = null;
                Connection conn = null;
                long begin = 0L;

                try {
                    begin = this.sqlBegin();
                    conn = this.getConn(‘w‘, firstOp);//取第一个来监理数据库连接
                    Iterator i$ = ops.iterator();

                    while(i$.hasNext()) {
                        OpBatchUpdate opb = (OpBatchUpdate)i$.next();
                        ps = conn.prepareStatement(opb.getSql());
                        opb.setParam(ps);
                        ps.executeUpdate();
                        if(ps != null) {
                            ps.close();
                        }
                    }
                } finally {
                    this.closeRSC((ResultSet)null, ps, conn);
                    this.sqlEnd("excutebatch sql,", begin);
                }

            } else {
                throw new SQLException(" ----- the bizName of the first opbatchupdate object can\‘t null -------------");
            }
        } else {
            throw new SQLException(" ----- the opbatchupdate list can\‘t null -------------");
        }
    }

对同一个库的同一个表进行批量插入操作。有两种方法:

以表smily_test为例:

CREATE TABLE `smily_test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uid` int(11) unsigned NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8;

1. for循环,将数据一条条插入。

insert into smily_test (uid) values(1);
insert into smily_test (uid) values(2);
insert into smily_test (uid) values(3);

2. 单次批量插入。

insert into smily_test (uid) values(1),(2),(3);

通过profile分析(查看mysql语句运行时间)得知:
方法2比方法1的效率高。

+----------+------------+------------------------------------------------+
| Query_ID | Duration   | Query                                          |
+----------+------------+------------------------------------------------+
|        5 | 0.00079800 | insert into smily_test (uid) values(1)         |
|        6 | 0.00081300 | insert into smily_test (uid) values(2)         |
|        7 | 0.00078700 | insert into smily_test (uid) values(3)         |
|        8 | 0.00083200 | insert into smily_test (uid) values(1),(2),(3) |
+----------+------------+------------------------------------------------+

总结:

 方法1:执行效率偏低,会进行多次数据库的连接,比较耗时。但是适用于散库、散表的情况。 

     若数据在不同的库,则只能进行多次数据库连接。

     若列表数据要插入同1个库的不同的表中,则可以选择1次数据库连接,多次数据插入执行的方式。

 方法2:执行时间短,只适用于对同一个库同一个表批量插入数据的情况。

时间: 2024-07-28 14:03:23

mysql批量插入数据的相关文章

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

最近公司要求测试数据库的性能,就上网查了一些批量插入数据的代码,发现有好几种不同的用法,插入同样数据的耗时也有区别 别的先不说,先上一段代码与君共享 方法一: package com.bigdata; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.sql.PreparedStatement; public class TestBigData { /**

mysql批量插入数据脚本

#!/bin/bash i=1; MAX_INSERT_ROW_COUNT=$1; while [ $i -le $MAX_INSERT_ROW_COUNT ] do mysql -uroot -proot dbname -e "insert into tablename (name,age,createTime) values ('HELLO$i',$i % 99,NOW());" d=$(date +%M-%d\ %H\:%m\:%S) echo "INSERT HELL

mysql 批量插入数据 优化

对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长.特别像报表系统,每天花费在数据导入上的时间可能会长达几个小时或十几个小时之久.因此,优化数据库插入性能是很有意义的. 经过对MySQL innodb的一些性能测试,发现一些可以提高insert效率的方法,供大家参考参考. 1. 一条SQL语句插入多条数据. 常用的插入语句如: MySQL 1 2 3 4 INSERT INTO `insert_table` (`datetime`, `uid`, `content

利用Jmeter向MySQL批量插入数据

1.   启动Jmeter 2.   添加 DBC Connection Configuration 右键线程组->添加->配置元件->JDBC Connection Configuration 添加后进行必要的配置 3.   添加参数化所需变量 配置 4.   添加JDBC Request 右键线程组->添加->Sampler->JDBC Request 配置: 4.1插入一千条数据 5.   添加查看结果树 6.   最后如下,对线程组进行必要的配置后,运行查看

mysql 批量插入数据

MySQL使用INSERT插入多条记录,应该如何操作呢?下面就为您详细介绍MySQL使用INSERT插入多条记录的实现方法,供您参考. 看到这个标题也许大家会问,这有什么好说的,调用多次INSERT语句不就可以插入多条记录了吗!但使用这种方法要增加服务器的负荷,因为,执行每一次SQL服务器都要同样对SQL进行分析.优化等操作.幸好MySQL提供了另一种解决方案,就是使用一条INSERT语句来插入多条记录.这并不是标准的SQL语法,因此只能在MySQL中使用. INSERT INTO users(

Mysql 批量插入数据的方法

使用的方式是 MySqlBulkLoader 方法如下: 1. 转化datatable 为文件 2. 使用MySqlBulkLoader 进行数据的加载 代码: public static void CreateCSVfile(DataTable dtable, string strFilePath) {     StreamWriter sw = new StreamWriter(strFilePath, false);     int icolcount = dtable.Columns.C

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

MYSQL批量插入数据库实现语句性能分析 假定我们的表结构如下 代码如下   CREATE TABLE example (example_id INT NOT NULL,name VARCHAR( 50 ) NOT NULL,value VARCHAR( 50 ) NOT NULL,other_value VARCHAR( 50 ) NOT NULL) 通常情况下单条插入的sql语句我们会这么写: 代码如下   INSERT INTO example(example_id, name, valu

mybatis foreach批量插入数据:Oracle与MySQL区别

mybatis foreach批量插入数据:Oracle与MySQL不同点: 主要不同点在于foreach标签内separator属性的设置问题: separator设置为","分割时,最终拼接的代码形式为:insert into table_name (a,b,c) values (v1,v2,v3) ,(v4,v5,v6) ,... separator设置为"union all"分割时,最终拼接的代码形式为:insert into table_name (a,b

用python操作mysql数据库(之批量插入数据)

#!/usr/bin/env python # -*- coding: utf-8 -*- import MySQLdb #建立连接 conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='1qaz#EDC',db='test_db') cur = conn.cursor() #对数据进行操作 li = [('tanzhenx','shaoguan'),('huangmengdie','shaoguan')] #定义一个列表,列表中