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 相关文章推荐
left join、inner join、right join的区别
Apr 05 MySQL
MySQL之DML语言
Apr 05 MySQL
MySql学习笔记之事务隔离级别详解
May 12 MySQL
MySQL如何构建数据表索引
May 13 MySQL
MySQL 覆盖索引的优点
May 19 MySQL
MYSQL(电话号码,身份证)数据脱敏的实现
May 28 MySQL
ORM模型框架操作mysql数据库的方法
Jul 25 MySQL
mysql sum(if())和count(if())的用法说明
Jan 18 MySQL
MySQL七大JOIN的具体使用
Feb 28 MySQL
MySQL慢查询优化解决问题
Mar 17 MySQL
MySQL sql模式设置引起的问题
May 15 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的面向对象编程
2006/10/09 PHP
经过绑定元素时会多次触发mouseover和mouseout事件
2014/02/28 Javascript
JS和jQuery使用submit方法无法提交表单的原因分析及解决办法
2016/05/17 Javascript
jQuery禁用快捷键例如禁用F5刷新 禁用右键菜单等的简单实现
2016/08/31 Javascript
Jquery给当前页或者跳转后页面的导航栏添加选中后样式的实例
2016/12/08 Javascript
微信小程序 闭包写法详细介绍
2016/12/14 Javascript
prototype与__proto__区别详细介绍
2017/01/09 Javascript
JS检测是否可以访问公网服务器功能代码
2017/06/19 Javascript
纯js实现页面返回顶部的动画(超简单)
2017/08/10 Javascript
js中事件对象和事件委托的介绍
2019/01/21 Javascript
用原生 JS 实现 innerHTML 功能实例详解
2019/04/03 Javascript
Preload基础使用方法详解
2020/02/03 Javascript
Python性能优化技巧
2015/03/09 Python
Using Django with GAE Python 后台抓取多个网站的页面全文
2016/02/17 Python
Python中的sort()方法使用基础教程
2017/01/08 Python
tensorflow saver 保存和恢复指定 tensor的实例讲解
2018/07/26 Python
python提取包含关键字的整行数据方法
2018/12/11 Python
Python 给定的经纬度标注在地图上的实现方法
2019/07/05 Python
Python压缩模块zipfile实现原理及用法解析
2020/08/14 Python
pycharm Tab键设置成4个空格的操作
2021/02/26 Python
美体小铺加拿大官方网站:The Body Shop加拿大
2016/10/30 全球购物
ECCO爱步加拿大官网:北欧丹麦鞋履及皮具品牌
2017/07/08 全球购物
澳大利亚排名第一的在线酒类商店:MyBottleShop
2018/04/26 全球购物
C语言怎样定义和声明全局变量和函数最好
2013/11/26 面试题
给酒店员工的表扬信
2014/01/11 职场文书
给儿子的表扬信
2014/01/15 职场文书
《中彩那天》教学反思
2014/02/22 职场文书
小学班主任寄语大全
2014/04/04 职场文书
快餐公司创业计划书
2014/04/29 职场文书
毕业生自荐材料范文
2014/12/30 职场文书
故宫的导游词
2015/01/31 职场文书
旅游项目合作意向书
2015/05/08 职场文书
2016大学军训通讯稿
2015/11/25 职场文书
描写九月优美句子(39条)
2019/09/11 职场文书
导游词之吉林吉塔
2019/11/11 职场文书
nginx配置文件使用环境变量的操作方法
2021/06/02 Servers