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表的增删改查(基础)
Apr 05 MySQL
MySQL安装后默认自带数据库的作用详解
Apr 27 MySQL
mysql left join快速转inner join的过程
Jun 30 MySQL
解决Mysql的left join无效及使用的注意事项说明
Jul 01 MySQL
MySQL连表查询分组去重的实现示例
Jul 01 MySQL
MySQL系列之七 MySQL存储引擎
Jul 02 MySQL
浅谈mysql哪些情况会导致索引失效
Nov 20 MySQL
MySQL中CURRENT_TIMESTAMP的使用方式
Nov 27 MySQL
简单聊一聊SQL注入及防止SQL注入
Mar 23 MySQL
mysql 乱码 字符集latin1转UTF8
Apr 19 MySQL
MySQL存储过程及语法详解
Aug 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
2021年最新CPU天梯图
2021/03/04 数码科技
php 搜索框提示(自动完成)实例代码
2012/02/05 PHP
如何判断php数组的维度
2013/06/10 PHP
php中有关合并某一字段键值相同的数组合并的改进
2015/03/10 PHP
php自定义截取中文字符串-utf8版
2017/02/27 PHP
PHP文件管理之实现网盘及压缩包的功能操作
2017/09/20 PHP
繁简字转换功能
2006/07/19 Javascript
javascript encodeURI和encodeURIComponent的比较
2010/04/03 Javascript
capacityFixed 基于jquery的类似于新浪微博新消息提示的定位框
2011/05/24 Javascript
使用js实现雪花飘落效果
2013/08/26 Javascript
jQuery中nextUntil()方法用法实例
2015/01/07 Javascript
node.js操作mongodb学习小结
2015/04/25 Javascript
JS实现无限级网页折叠菜单(类似树形菜单)效果代码
2015/09/17 Javascript
jQuery实现进度条效果代码
2015/12/17 Javascript
js中使用使用原型(prototype)定义方法的好处详解
2016/07/04 Javascript
对js中回调函数的一些看法
2016/08/29 Javascript
JS实现改变HTML上文字颜色和内容的方法
2016/12/30 Javascript
解决vue里碰到 $refs 的问题的方法
2017/07/13 Javascript
layui-laydate时间日历控件使用方法详解
2018/11/15 Javascript
用原生 JS 实现 innerHTML 功能实例详解
2019/04/03 Javascript
使用uni-app开发微信小程序的实现
2019/12/13 Javascript
vue中利用iscroll.js解决pc端滚动问题
2020/02/15 Javascript
vue组件中节流函数的失效的原因和解决方法
2020/12/02 Vue.js
Python实现把utf-8格式的文件转换成gbk格式的文件
2015/01/22 Python
详解Python发送邮件实例
2016/01/10 Python
Python 使用SMTP发送邮件的代码小结
2016/09/21 Python
Python编程实现数学运算求一元二次方程的实根算法示例
2017/04/02 Python
Python通过命令开启http.server服务器的方法
2017/11/04 Python
简单瞅瞅Python vars()内置函数的实现
2019/09/27 Python
英国最大的正宗复古足球衫制造商和零售商:TOFFS
2018/06/21 全球购物
网络安全方面的面试题
2015/11/04 面试题
创意婚礼策划方案
2014/05/18 职场文书
计算机毕业生自荐信
2014/06/12 职场文书
离婚协议书该怎么写
2014/10/04 职场文书
python基于tkinter制作下班倒计时工具
2021/04/28 Python
Java 多态分析
2022/04/26 Java/Android