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 07 MySQL
MySQL主从搭建(多主一从)的实现思路与步骤
May 13 MySQL
Mysql数据库索引面试题(程序员基础技能)
May 31 MySQL
mysql sum(if())和count(if())的用法说明
Jan 18 MySQL
mysql使用instr达到in(字符串)的效果
Apr 03 MySQL
MySQL创建管理RANGE分区
Apr 13 MySQL
MySQL分区以及建索引的方法总结
Apr 13 MySQL
解决Mysql中的innoDB幻读问题
Apr 29 MySQL
MySQL索引 高效获取数据的数据结构
May 02 MySQL
MySQL安装失败的原因及解决步骤
Jun 14 MySQL
MySQL一劳永逸永久支持输入中文的方法实例
Aug 05 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/03/01 无线电
php 8小时时间差的解决方法小结
2009/12/22 PHP
利用phpexcel把excel导入数据库和数据库导出excel实现
2014/01/09 PHP
PHP经典面试题集锦
2015/03/19 PHP
php将字符串随机分割成不同长度数组的方法
2015/06/01 PHP
WordPress用户登录框密码的隐藏与部分显示技巧
2015/12/31 PHP
ThinkPHP实现附件上传功能
2017/04/27 PHP
通过修改Laravel Auth使用salt和password进行认证用户详解
2017/08/17 PHP
Jquery 表单取值赋值的一些基本操作
2009/10/11 Javascript
javascipt匹配单行和多行注释的正则表达式
2013/11/20 Javascript
表格奇偶行设置不同颜色的核心JS代码
2013/12/24 Javascript
jQuery的文档处理程序详解
2016/05/10 Javascript
js字符串操作总结(必看篇)
2016/11/22 Javascript
Bootstrap实现基于carousel.js框架的轮播图效果
2017/05/02 Javascript
ionic2懒加载配置详解
2017/09/01 Javascript
jquery获取transform里的值实现方法
2017/12/12 jQuery
Angular实现的table表格排序功能完整示例
2017/12/22 Javascript
element-ui 限制日期选择的方法(datepicker)
2018/05/16 Javascript
angular 服务的单例模式(依赖注入模式下)详解
2018/10/22 Javascript
VUE table表格动态添加一列数据,新增的这些数据不可以编辑(v-model绑定的数据不能实时更新)
2020/04/03 Javascript
Python最基本的数据类型以及对元组的介绍
2015/04/14 Python
Python常见数据类型转换操作示例
2019/05/08 Python
PyQt5 加载图片和文本文件的实例
2019/06/14 Python
Django1.11自带分页器paginator的使用方法
2019/10/31 Python
Python3爬虫中pyspider的安装步骤
2020/07/29 Python
德国购买门票网站:ADticket.de
2019/10/31 全球购物
英国最大的独立摄影零售商:Park Cameras
2019/11/27 全球购物
JAVA中的关键字有什么特点
2014/03/07 面试题
优秀员工表扬信
2014/01/17 职场文书
办公自动化毕业生求职信
2014/03/09 职场文书
农村产权制度改革实施方案
2014/03/21 职场文书
家长通知书家长意见
2014/12/30 职场文书
博士给导师的自荐信
2015/03/06 职场文书
2015年小学总务工作总结
2015/07/21 职场文书
2016党员干部政治学习心得体会
2016/01/23 职场文书
利用Python实现翻译HTML中的文本字符串
2022/06/21 Python