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查询语句
May 26 MySQL
你知道哪几种MYSQL的连接查询
Jun 03 MySQL
Mysql 设置boolean类型的操作
Jun 04 MySQL
MySQL修改默认引擎和字符集详情
Sep 25 MySQL
MySQL和Oracle批量插入SQL的通用写法示例
Nov 17 MySQL
SQL语法CONSTRAINT约束操作详情
Jan 18 MySQL
一文简单了解MySQL前缀索引
Apr 03 MySQL
解决MySQL报“too many connections“错误
Apr 19 MySQL
使用Mysql计算地址的经纬度距离和实时位置信息
Apr 29 MySQL
MySQL 计算连续登录天数
May 11 MySQL
MySql数据库触发器使用教程
Jun 01 MySQL
MySQL 语句执行顺序举例解析
Jun 05 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&amp;java(二)
2006/10/09 PHP
mysq GBKl乱码
2006/11/28 PHP
PHP安全技术之 实现php基本安全
2010/09/04 PHP
PHP获取数组中某元素的位置及array_keys函数应用
2013/01/29 PHP
使用php批量删除数据库下所有前缀为prefix_的表
2014/06/09 PHP
PHP+Mysql基于事务处理实现转账功能的方法
2015/07/08 PHP
php中isset与empty函数的困惑与用法分析
2019/07/05 PHP
JavaScript 编写匿名函数的几种方法
2010/02/21 Javascript
jQuery EasyUI API 中文文档 - TimeSpinner时间微调器
2011/10/23 Javascript
js获取当前地址 JS获取当前URL的示例代码
2014/02/26 Javascript
跟我学习javascript的定时器
2015/11/19 Javascript
JS动态计算移动端rem的解决方案
2016/10/14 Javascript
Bootstrap CSS组件之按钮组(btn-group)
2016/12/17 Javascript
微信小程序 自己制作小组件实例详解
2016/12/22 Javascript
vue脚手架搭建过程图解
2018/06/06 Javascript
jQuery实现的导航条点击后高亮显示功能示例
2019/03/04 jQuery
微信小程序开发实现消息推送
2020/11/18 Javascript
vue读取本地的excel文件并显示在网页上方法示例
2019/05/29 Javascript
JS使用cookie保存用户登录信息操作示例
2019/05/30 Javascript
百度小程序之间的页面通信过程详解
2019/07/18 Javascript
基于Layui自定义模块的使用方法详解
2019/09/14 Javascript
vue中实现动态生成二维码的方法
2020/02/21 Javascript
element日历calendar组件上月、今天、下月、日历块点击事件及模板源码
2020/07/27 Javascript
Python中使用hashlib模块处理算法的教程
2015/04/28 Python
Python每天必学之bytes字节
2016/01/28 Python
python在html中插入简单的代码并加上时间戳的方法
2018/10/16 Python
在python里从协程返回一个值的示例
2019/02/19 Python
Python面向对象程序设计类的多态用法详解
2019/04/12 Python
python递归法解决棋盘分割问题
2019/07/17 Python
会计毕业生自我鉴定
2013/11/04 职场文书
《月球之谜》教学反思
2014/04/10 职场文书
党员反对四风问题思想汇报
2014/09/12 职场文书
水浒传读书笔记
2015/06/25 职场文书
2016天猫双十一广告语
2016/01/28 职场文书
财务年终工作总结大全
2019/06/20 职场文书
Java9新特性之Module模块化编程示例演绎
2022/03/16 Java/Android