mysql中批量插入数据(1万、10万、100万、1000万、1亿级别)

目录
  • 方法一:
  • 方法二:
  • 总结:

硬件:windows7+8G内存+i3-4170处理器+4核CPU

首先贴上数据库的操作类BaseDao:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import com.lk.entity.TUser;

public class BaseDao {
    private static ConfigManager cm = ConfigManager.getInstance();

    private static String Driver = null;
    private static String URL = null;
    private static String USER = null;
    private static String PWD = null;

    private static Connection conn = null;
    private static PreparedStatement psmt = null;
    public ResultSet rs = null;
    public int row = 0;

    static {
        Driver = cm.getString("DRIVER");
        URL = cm.getString("URL");
        USER = cm.getString("USER");
        PWD = cm.getString("PWD");
        try {
            Class.forName(Driver);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        getConnection();
        try {
            conn.setAutoCommit(false);
            psmt = conn.prepareStatement("");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    private static Connection getConnection() {
        try {
            conn = DriverManager.getConnection(URL, USER, PWD);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

    /**
     * 多条记录插入操作
     * flag是为了判断是否是插入的最后一个记录
     */
    public boolean affectRowMore(String sql, List<TUser> list, long flag) {
        try {
            psmt = conn.prepareStatement(sql);
            for (TUser tUser : list) {
                psmt.setLong(1, tUser.getId());
                psmt.setString(2, tUser.getName());
                psmt.setInt(3, tUser.getSex());
                psmt.setString(4, tUser.getPhone());
                psmt.setString(5, tUser.getPassword());
                // 添加执行sql
                psmt.addBatch();
            }
            // 执行操作
            int[] counts = psmt.executeBatch(); // 执行Batch中的全部语句
            conn.commit(); // 提交到数据库
            for (int i : counts) {
                if (i == 0) {
                    conn.rollback();
                }
            }
            closeAll(flag);
        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 多条记录插入操作
     */
    public boolean affectRowMore1(String sql, long flag) {
        try {
            psmt.addBatch(sql);
            // 执行操作
            int[] counts = psmt.executeBatch(); // 执行Batch中的全部语句
            conn.commit(); // 提交到数据库
            for (int i : counts) {
                if (i == 0) {
                    conn.rollback();
                    return false;
                }
            }
            closeAll(flag);
        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    public void closeAll(long flag) {
        try {
            if (conn != null && flag == -1) {
                // 在完成批量操作后恢复默认的自动提交方式,提高程序的可扩展性
                conn.setAutoCommit(true);
                conn.close();
            }
            if (psmt != null && flag == -1) {
                psmt.close();
            }
            if (rs != null) {
                rs.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

方法一:

通过BaseDao中的affectRowMore方法进行插入,插入的速度如下所示:

* 一万条数据(通过多条添加)
     * 生成1万条数据共花费978毫秒
     * 生成10万条数据共花费5826毫秒
     * 生成100万条数据共花费54929毫秒
     * 生成1000万条数据共花费548640毫秒
     * 生成1亿条数据(因为数字过大,没有计算)

public void insertBenchMark() {
        long start = System.currentTimeMillis();
        List<TUser> list = new ArrayList<>();
        long row = 1;
        for (int j = 0; j < 1000; j++) {
            for (int i = 0; i < 10000; i++) {
                String uuid = UUID.randomUUID().toString();
                String name = uuid.substring(0, 4);
                int sex = -1;
                if(Math.random() < 0.51) {
                    sex = 1;
                }else {
                    sex = 0;
                }
                String phone = (String) RandomValue.getAddress().get("tel");
                list.add(new TUser(row,name, sex, phone, uuid));
                row++;
            }
            int flag = 1;
            if(j==999) {
                flag = -1;
            }
            //封装好的
            boolean b = userDao.insertMore(list,flag);
            if(!b) {
                System.out.println("出错了----");
                System.exit(0);
            }else {
                list.clear();
            }
        }
        long end = System.currentTimeMillis();
        System.out.println("生成1000万条数据共花费"+(end-start)+"毫秒");
    }

public boolean insertMore(List<TUser> list,long flag) {
        String sql = "insert into tuser(id,name,sex,phone,password) values(?,?,?,?,?)";
        return affectRowMore(sql,list,flag);
    }

方法二:

通过BaseDao中的affectRowMore1方法进行数据的插入操作,插入的速度如下:

* 通过拼接语句实现多条添加
     * 生成1万条数据共花费225毫秒
     * 生成10万条数据共花费1586毫秒
     * 生成100万条数据共花费14017毫秒
     * 生成1000万条数据共花费152127毫秒
     * 生成1亿条数据(因为数字过大,没有计算)

public void insertBenchMark1() {
        long start = System.currentTimeMillis();
        StringBuffer suffix = new StringBuffer();
        long row = 1;
        for (int j = 0; j < 1000; j++) {
            for (int i = 0; i < 10000; i++) {
                String uuid = UUID.randomUUID().toString();
                String name = uuid.substring(0, 4);
                int sex = -1;
                if(Math.random() < 0.51) {
                    sex = 1;
                }else {
                    sex = 0;
                }
                String phone = (String) RandomValue.getAddress().get("tel");
                suffix.append("(" + row + ",'" + name + "'," + sex + ",'" + phone + "','" + uuid + "'),");
                row++;
            }
            boolean b = userDao.insertMore1(suffix.substring(0, suffix.length()-1),j);
            if(!b) {
                System.out.println("出错了----");
                System.exit(0);
            }else {
                // 清空上一次添加的数据
                suffix = new StringBuffer();
            }
        }
        long end = System.currentTimeMillis();
        System.out.println("生成1000万条数据共花费"+(end-start)+"毫秒");
    }

public boolean insertMore1(String sql_suffix,long flag) {
        String sql_prefix = "insert into tuser(id,name,sex,phone,password) values ";
        return affectRowMore1(sql_prefix + sql_suffix,flag);
    }

总结:

方法一和方法二很类同,唯一不同的是方法一采用的是“insert into tb (...) values (...);insert into tb (...) values (...);...”的方式执行插入操作,方法二则是“insert into tb (...) values(...),(...)...;”的方式。

通过测试的对比,方法二比方法一快了近5倍。

到此这篇关于mysql中批量插入数据(1万、10万、100万、1000万、1亿级别)的文章就介绍到这了,更多相关mysql 批量插入数据内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java 下执行mysql 批量插入的几种方法及用时

    方法1: Java code 复制代码 代码如下: conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASS);        pstmt = conn                .prepareStatement("insert into loadtest (id, data) values (?, ?)");        for (int i = 1; i <= COUNT; i++) {    

  • MYSQL开发性能研究之批量插入数据的优化方法

    一.我们遇到了什么问题 在标准SQL里面,我们通常会写下如下的SQL insert语句. INSERT INTO TBL_TEST (id) VALUES(1); 很显然,在MYSQL中,这样的方式也是可行的.但是当我们需要批量插入数据的时候,这样的语句却会出现性能问题.例如说,如果有需要插入100000条数据,那么就需要有100000条insert语句,每一句都需要提交到关系引擎那里去解析,优化,然后才能够到达存储引擎做真的插入工作. 正是由于性能的瓶颈问题,MYSQL官方文档也就提到了使用批

  • c#几种数据库的大数据批量插入(SqlServer、Oracle、SQLite和MySql)

    在之前只知道SqlServer支持数据批量插入,殊不知道Oracle.SQLite和MySql也是支持的,不过Oracle需要使用Orace.DataAccess驱动,今天就贴出几种数据库的批量插入解决方法. 首先说一下,IProvider里有一个用于实现批量插入的插件服务接口IBatcherProvider,此接口在前一篇文章中已经提到过了. /// <summary> /// 提供数据批量处理的方法. /// </summary> public interface IBatch

  • MySQL实现批量插入以优化性能的教程

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

  • mysql 循环批量插入的实例代码详解

    背景 前几天在MySql上做分页时,看到有博文说使用 limit 0,10 方式分页会有丢数据问题,有人又说不会,于是想自己测试一下.测试时没有数据,便安装了一个MySql,建了张表,在建了个while循环批量插入10W条测试数据的时候,执行时间之长无法忍受,便查资料找批量插入优化方法,这里做个笔记. 数据结构 寻思着分页时标准列分主键列.索引列.普通列3种场景,所以,测试表需要包含这3种场景,建表语法如下: drop table if exists `test`.`t_model`; Crea

  • MYSQL批量插入数据的实现代码第1/3页

    @echo off cls set CLASSPATH=..\api\jogre.jar set CLASSPATH=%CLASSPATH%;. set CLASSPATH=%CLASSPATH%;classes set CLASSPATH=%CLASSPATH%;lib\dom4j.jar java org.jogre.server.JogreServer 建表 复制代码 代码如下: create database con_test; use con_test; create table te

  • MySQL如何快速批量插入1000w条数据

    听说有个面试题是: 如何快速向mysql中插入1000w条数据? 我私下试了一下, 发现插入10000条数据用了0.9s, 插入10w条数据用了4.7s, 插入100w条数据用了58s左右,1000w条数据,我的笔记本吭哧了5分钟,自己停了, 心中1000w只草泥马呼啸而过,我用的是下面的代码: -- 进入数据库 use test; -- 显示所有表 show tables; -- 创建majors表 create table majors(id int, major varchar(255))

  • MySQL批量插入遇上唯一索引避免方法

    一.背景 以前使用SQL Server进行表分区的时候就碰到很多关于唯一索引的问题:Step8:SQL Server 当表分区遇上唯一约束,没想到在MySQL的分区中一样会遇到这样的问题:MySQL表分区实战. 今天我们来了解MySQL唯一索引的一些知识:包括如何创建,如何批量插入,还有一些技巧上SQL: 这些问题的根源在什么地方?有什么共同点?MySQL中也有分区对齐的概念?唯一索引是在很多系统中都会出现的要求,有什么办法可以避免?它对性能的影响有多大? 二.过程 (一) 导入差异数据,忽略重

  • mysql大批量插入数据的4种方法示例

    前言 本文主要给大家介绍了关于mysql大批量插入数据的4种方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 方法一:循环插入 这个也是最普通的方式,如果数据量不是很大,可以使用,但是每次都要消耗连接数据库的资源. 大致思维如下 (我这里写伪代码,具体编写可以结合自己的业务逻辑或者框架语法编写) for($i=1;$i<=100;$i++){ $sql = 'insert...............'; //querysql } foreach($arr as $key =

  • mysql中批量插入数据(1万、10万、100万、1000万、1亿级别)

    目录 方法一: 方法二: 总结: 硬件:windows7+8G内存+i3-4170处理器+4核CPU 首先贴上数据库的操作类BaseDao: import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; impor

  • php往mysql中批量插入数据实例教程

    前言 假如说我有这样一个表,我想往这个表里面插入大量数据 CREATE TABLE IF NOT EXISTS `user_info` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键', `name` varchar(255) NOT NULL default '' COMMENT '姓名', `age` int(11) NOT NULL default '0' COMMENT '年龄', PRIMARY KEY (`id`) ) ENG

  • JDBC连接MySQL数据库批量插入数据过程详解

    这篇文章主要介绍了JDBC连接MySQL数据库批量插入数据过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.读取本地json数据 2.jdbc理解数据库 3.批量插入 maven 引入jar包: <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2

  • 用shell脚本在mysql表中批量插入数据的方法

    很多时候需要在mysql表中插入大量测试数据,下面分享一个用shell脚本通过while循环批量生成mysql测试数据的方法,你只需要根据你自己的表结构来生成sql语句即可. 复制代码 代码如下: #!/bin/bash i=1;MAX_INSERT_ROW_COUNT=$1;while [ $i -le $MAX_INSERT_ROW_COUNT ]do    mysql -uroot -proot afs -e "insert into afs_test (name,age,createTi

  • 详解C#批量插入数据到Sqlserver中的四种方式

    本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快的,因为你生成一个GUID算法所花的时间肯定比你从数据表中重新查询上一条记录的ID的值然后再进行加1运算要少.而如果存在索引的情况下,每次插入记录都会进行索引重建,这是非常耗性能的.如果表中无可避免的存在索引,我们可以通过先删除索引,然后批量插入,最后再重建索引的方式来提高效率. create database C

  • C#批量插入数据到Sqlserver中的三种方式

    本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快的,因为你生成一个GUID算法所花的时间肯定比你从数据表中重新查询上一条记录的ID的值然后再进行加1运算要少.而如果存在索引的情况下,每次插入记录都会进行索引重建,这是非常耗性能的.如果表中无可避免的存在索引,我们可以通过先删除索引,然后批量插入,最后再重建索引的方式来提高效率. create database C

  • C#实现SQL批量插入数据到表的方法

    本文实例讲述了C#实现SQL批量插入数据到表的方法.分享给大家供大家参考,具体如下: #region 帮助实例:SQL 批量插入数据 多种方法 /// <summary> /// SqlBulkCopy往数据库中批量插入数据 /// </summary> /// <param name="sourceDataTable">数据源表</param> /// <param name="targetTableName"

  • MySQL通过函数存储过程批量插入数据

    目录 数据库 mysql批量插入数据函数存储过程 附:MySQL通过函数批量插入数据 总结 数据库 mysql批量插入数据函数存储过程 -- 1 批量插入数据 -- 1.1 创建表 CREATE TABLE `dept` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `deptName` VARCHAR(30) DEFAULT NULL, `address` VARCHAR(40) DEFAULT NULL, ceo INT NULL , PRIMARY KEY

  • Python操控mysql批量插入数据的实现方法

    在Python中,通过pymysql模块,编写简短的脚本,即方便快捷地控制MySQL数据库 一.连接数据库 使用的函数:pymysql.connect 语法:db=pymysql.connect(host='localhost',user='root',port=3306,password='Your password',db='database_name') 参数说明:host:MySQL服务器地址                           user:用户名             

随机推荐