MySQL数据库10秒内插入百万条数据的实现


Posted in MySQL onNovember 01, 2021

首先我们思考一个问题:

要插入如此庞大的数据到数据库,正常情况一定会频繁地进行访问,什么样的机器设备都吃不消。那么如何避免频繁访问数据库,能否做到一次访问,再执行呢?

Java其实已经给了我们答案。

这里就要用到两个关键对象:StatementPrepareStatement

我们来看一下二者的特性:

MySQL数据库10秒内插入百万条数据的实现

要用到的BaseDao工具类 (jar包 / Maven依赖) (Maven依赖代码附在文末)(封装以便于使用)

MySQL数据库10秒内插入百万条数据的实现

注:(重点)rewriteBatchedStatements=true,一次插入多条数据,只插入一次!!

public class BaseDao {  //  静态工具类,用于创建数据库连接对象和释放资源,方便调用
    //    导入驱动jar包或添加Maven依赖(这里使用的是Maven,Maven依赖代码附在文末)
    static {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
 
    //  获取数据库连接对象
    public static Connection getConn() {
        Connection conn = null;
        try {
            //  rewriteBatchedStatements=true,一次插入多条数据,只插入一次
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/million-test?rewriteBatchedStatements=true", "root", "qwerdf");
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return conn;
    }
 
    //  释放资源
    public static void closeAll(AutoCloseable... autoCloseables) {
        for (AutoCloseable autoCloseable : autoCloseables) {
            if (autoCloseable != null) {
                try {
                    autoCloseable.close();
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
}

接下来上关键代码及注释:

/*  因为数据库的处理速度是非常惊人的 单次吞吐量很大 执行效率极高
    addBatch()把若干sql语句装载到一起,然后一次送到数据库执行,执行需要很短的时间
    而preparedStatement.executeUpdate() 是一条一条发往数据库执行的 时间都消耗在数据库连接的传输上面*/
public static void main(String[] args) {
    long start = System.currentTimeMillis();    //  获取系统当前时间,方法开始执行前记录
    Connection conn = BaseDao.getConn();        //  调用刚刚写好的用于获取连接数据库对象的静态工具类
    String sql = "insert into mymilliontest values(null,?,?,?,NOW())";  //  要执行的sql语句
    PreparedStatement ps = null;
    try {
        ps = conn.prepareStatement(sql);    //  获取PreparedStatement对象
        //  不断产生sql
        for (int i = 0; i < 1000000; i++) {
            ps.setString(1, Math.ceil(Math.random() * 1000000) + "");
            ps.setString(2, Math.ceil(Math.random() * 1000000) + "");
            ps.setString(3, UUID.randomUUID().toString());  //  UUID该类用于随机生成一串不会重复的字符串
            ps.addBatch();  //  将一组参数添加到此 PreparedStatement 对象的批处理命令中。
        }
        int[] ints = ps.executeBatch();//   将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。
        //  如果数组长度不为0,则说明sql语句成功执行,即百万条数据添加成功!
        if (ints.length > 0) {
            System.out.println("已成功添加一百万条数据!!");
        }
    } catch (SQLException throwables) {
        throwables.printStackTrace();
    } finally {
        BaseDao.closeAll(conn, ps);  //  调用刚刚写好的静态工具类释放资源
    }
    long end = System.currentTimeMillis();  //  再次获取系统时间
    System.out.println("所用时长:" + (end - start) / 1000 + "秒");  //  两个时间相减即为方法执行所用时长
}

最后我们运行看一下效果:

MySQL数据库10秒内插入百万条数据的实现

MySQL数据库10秒内插入百万条数据的实现

嘿嘿,这里时长超过了10秒,设备差点意思,希望理解哈~

MySQL数据库10秒内插入百万条数据的实现

<!--连接数据库所用到的mysql-connector-java依赖-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.27</version>
</dependency>

PS : 添上线程后会更快,在后续的文章中会作示例。

到此这篇关于MySQL数据库10秒内插入百万条数据的实现的文章就介绍到这了,更多相关MySQL 插入百万条数据 内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
新手必备之MySQL msi版本下载安装图文详细教程
May 21 MySQL
MySQL修改默认引擎和字符集详情
Sep 25 MySQL
mysql中int(3)和int(10)的数值范围是否相同
Oct 16 MySQL
Mysql忘记密码解决方法
Feb 12 MySQL
MySQL优化常用的19种有效方法(推荐!)
Mar 17 MySQL
MySQL学习之基础操作总结
Mar 19 MySQL
CentOS 7安装mysql5.7使用XtraBackUp备份工具命令详解
Apr 12 MySQL
mysql使用 not int 子查询隐含陷阱
Apr 12 MySQL
分析MySQL优化 index merge 后引起的死锁
Apr 19 MySQL
MySQL提取JSON字段数据实现查询
Apr 22 MySQL
MYSQL事务的隔离级别与MVCC
May 25 MySQL
mysql字段为NULL索引是否会失效实例详解
May 30 MySQL
MySQL面试题讲解之如何设置Hash索引
MySQL对数据表已有表进行分区表的实现
Nov 01 #MySQL
mysql分表之后如何平滑上线详解
Nov 01 #MySQL
MySQL8.0升级的踩坑历险记
Nov 01 #MySQL
详细聊聊关于Mysql联合查询的那些事儿
Oct 24 #MySQL
mysql事务对效率的影响分析总结
Oct 24 #MySQL
mysql事务隔离级别详情
You might like
探寻PHP脚本不报错的原因
2014/06/12 PHP
PHP 的比较运算与逻辑运算详解
2016/05/12 PHP
微信封装的调用微信签名包的类库
2017/06/08 PHP
PHP实现的猴王算法(猴子选大王)示例
2018/04/30 PHP
抽出www.templatemonster.com的鼠标悬停加载大图模板的代码
2007/07/11 Javascript
由document.body和document.documentElement想到的
2009/04/13 Javascript
XMLHTTPRequest的属性和方法简介
2010/11/23 Javascript
jQuery设置指定网页元素宽度和高度的方法
2015/03/25 Javascript
关于安卓手机微信浏览器中使用XMLHttpRequest 2上传图片显示字节数为0的解决办法
2016/05/17 Javascript
Angular.js实现注册系统的实例详解
2016/12/18 Javascript
JS实现图片放大镜插件详解
2017/11/06 Javascript
vue 插值 v-once,v-text, v-html详解
2018/01/19 Javascript
在vue项目中引入highcharts图表的方法(详解)
2018/03/05 Javascript
原生js封装的ajax方法示例
2018/08/02 Javascript
详解JavaScript实现动态的轮播图效果
2019/04/29 Javascript
微信用户访问小程序的登录过程详解
2019/09/20 Javascript
python实现调用其他python脚本的方法
2014/10/05 Python
Python利用ansible分发处理任务
2015/08/04 Python
Tensorflow环境搭建的方法步骤
2018/02/07 Python
Python从使用线程到使用async/await的深入讲解
2018/09/16 Python
对numpy下的轴交换transpose和swapaxes的示例解读
2019/06/26 Python
Python编写打字训练小程序
2019/09/26 Python
python实现UDP协议下的文件传输
2020/03/20 Python
python 异步async库的使用说明
2020/05/04 Python
python怎么自定义捕获错误
2020/06/29 Python
HTML5 绘制图像(上)之:关于canvas元素引领下一代web页面的问题
2013/04/24 HTML / CSS
在Java开发中如何选择使用哪种集合类
2016/08/09 面试题
法院实习人员自我鉴定
2013/09/26 职场文书
消防安全员岗位职责
2014/03/10 职场文书
青年标兵事迹材料
2014/08/16 职场文书
乡镇领导班子四风整顿行动工作汇报
2014/10/25 职场文书
2014年财务经理工作总结
2014/12/08 职场文书
2015最新学生自我评价范文
2015/03/03 职场文书
《暗黑破坏神2:重制版》本周进行第一轮A测 目前可官网进行申请报名
2021/04/07 其他游戏
JPA 通过Specification如何实现复杂查询
2021/11/23 Java/Android
使用vuex-persistedstate本地存储vuex
2022/04/29 Vue.js