iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >mysql中批量插入数据(1万、10万、100万、1000万、1亿级别)
  • 585
分享到

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

mysql批量插入数据mysql批量插入上亿数据 2022-08-15 10:08:10 585人浏览 独家记忆
摘要

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

硬件: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;
    }
 
    
    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 批量插入数据内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

您可能感兴趣的文档:

--结束END--

本文标题: mysql中批量插入数据(1万、10万、100万、1000万、1亿级别)

本文链接: https://www.lsjlt.com/news/33691.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java实现百万级数据量向MySQL批量插入
    业务背景: 大数据向mysql表同步百万级数量,我们需要将大数据表里同步过来的数据分别向三张业务表做数据同步,最终将业务表的数据展示给前台进行相关业务操作。 数据量级 大数据表:700w数据量 三张业务表分别需要同步:23w、80w、680...
    99+
    2023-08-25
    mysql java mybatis
  • mybatis批量插入10万条数据的示例分析
    这篇文章给大家分享的是有关mybatis批量插入10万条数据的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。数据库 在使用mybatis插入大量数据的时候,为了提高效率,放弃循环插入,改为批量插入,map...
    99+
    2023-06-14
  • 详解mybatis批量插入10万条数据的优化过程
    数据库 在使用mybatis插入大量数据的时候,为了提高效率,放弃循环插入,改为批量插入,mapper如下: package com.lcy.service.mapper; ...
    99+
    2024-04-02
  • 怎么在MySql中插入千万级大数据
    今天就跟大家聊聊有关怎么在MySql中插入千万级大数据,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。第一步,读取文件,开始插入多线程在这里,达到一定...
    99+
    2024-04-02
  • Python大批量写入数据(百万级别)的方法
    目录背景方案代码方案二方案一总结背景 现有一个百万行数据的csv格式文件,需要在两分钟之内存入数据库。 方案 方案一:多线程+协程+异步MySql方案二:多线程+MySql批量插入 ...
    99+
    2023-08-08
    python批量写入文件 python处理大量数据 python批量处理数据
  • MySQL NDB如何进行批量更新100万行数据
    本篇文章为大家展示了MySQL NDB如何进行批量更新100万行数据,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 生产NDB数据库中...
    99+
    2024-04-02
  • 向MySQL中插入100万条数据需要多长时间
    本篇内容主要讲解“向MySQL中插入100万条数据需要多长时间”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“向MySQL中插入100万条数据需要多长时间”吧!目...
    99+
    2024-04-02
  • 如何实现88秒插入1000万条数据到MySQL数据库表
    这篇文章将为大家详细讲解有关如何实现88秒插入1000万条数据到MySQL数据库表,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。我用到的数据库为,mysql数据库5.7版...
    99+
    2024-04-02
  • MySQL数据库10秒内插入百万条数据的实现
    首先我们思考一个问题: 要插入如此庞大的数据到数据库,正常情况一定会频繁地进行访问,什么样的机器设备都吃不消。那么如何避免频繁访问数据库,能否做到一次访问,再执行呢? Java其实已...
    99+
    2024-04-02
  • Mysql百万量级数据如何高效导入Redis
    Mysql百万量级数据如何高效导入Redis,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。随着系统的运行,数据量变得越来越大,...
    99+
    2024-04-02
  • java 批量插入千万条数据优化方案【值得收藏】
    场景介绍 再实际开发应用中总会面临导入大批量数据插入数据库、数据迁移、同步等操作在java 后台执行,执行效率的优化问题随之而来!比如如何快速往MySQL数据库中导入1000万数据 mybatis MySQL中新...
    99+
    2023-08-17
    java mybatis mysql
  • Kettle--MySQL生产数据库千万、亿级数据量迁移方案及性能优化
    一、Kettle环境搭建 一、Windows主要用于可视化创建数据迁移用到的ktr转换脚本、kjb作业脚本,以及脚本需要配置的DB2信息、读写性能优化信息等,也可直接在客户端完成不同数据库之间的数据迁移。 测试库表及数据 (1)创建测试库表...
    99+
    2023-09-10
    数据库 linux 服务器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作