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 18 MySQL
为什么MySQL分页用limit会越来越慢
Jul 25 MySQL
MySQL修改默认引擎和字符集详情
Sep 25 MySQL
MySQL面试题讲解之如何设置Hash索引
Nov 01 MySQL
解决Mysql多行子查询的使用及空值问题
Jan 22 MySQL
MySQL 开窗函数
Feb 15 MySQL
解决MySQL报“too many connections“错误
Apr 19 MySQL
MySQL中EXPLAIN语句及用法
May 20 MySQL
mysql查看表结构的三种方法总结
Jul 07 MySQL
SQLServer常见数学函数梳理总结
Aug 05 MySQL
MySQL 原理优化之Group By的优化技巧
Aug 14 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 在文件指定行插入数据的代码
2010/05/08 PHP
PHP中使用crypt()实现用户身份验证的代码
2012/09/05 PHP
php自动给文章加关键词链接的函数代码
2012/11/29 PHP
phpadmin如何导入导出大数据文件及php.ini参数修改
2013/02/18 PHP
PHP curl实现抓取302跳转后页面的示例
2014/07/04 PHP
写了10年的Javascript也未必全了解的连续赋值运算
2011/03/25 Javascript
基于jQuery的input输入框下拉提示层(自动邮箱后缀名)
2012/06/14 Javascript
使用 Node.js 做 Function Test实现方法
2013/10/25 Javascript
js 动态修改css文件的方法
2014/08/05 Javascript
jQuery结合HTML5制作的爱心树表白动画
2015/02/01 Javascript
基于JavaScript获取鼠标位置的各种方法
2015/12/16 Javascript
微信小程序 火车票查询实例讲解
2016/10/17 Javascript
使用JavaScript进行表单校验功能
2017/08/01 Javascript
Vue ElementUI之Form表单验证遇到的问题
2017/08/21 Javascript
微信小程序new Date()方法失效问题解决方法
2019/07/29 Javascript
JavaScript实现随机五位数验证码
2019/09/27 Javascript
基于VUE的v-charts的曲线显示功能
2019/10/01 Javascript
vue使用过滤器格式化日期
2021/01/20 Vue.js
[02:51]DOTA2战队出征照拍摄花絮 TI3明星化身时尚男模
2013/07/22 DOTA
Python返回真假值(True or False)小技巧
2015/04/10 Python
python八大排序算法速度实例对比
2017/12/06 Python
pandas把dataframe转成Series,改变列中值的类型方法
2018/04/10 Python
Python3.4 tkinter,PIL图片转换
2018/06/21 Python
利用Python将每日一句定时推送至微信的实现方法
2018/08/13 Python
使用pandas把某一列的字符值转换为数字的实例
2019/01/29 Python
通过实例了解Python str()和repr()的区别
2020/01/17 Python
Python 爬取必应壁纸的实例讲解
2020/02/24 Python
python3.9.1环境安装的方法(图文)
2021/02/02 Python
css3类选择器之结合元素选择器和多类选择器用法
2017/03/09 HTML / CSS
老板电器官方购物商城:老板油烟机、燃气灶、消毒柜、电烤箱
2018/05/30 全球购物
艺术学院毕业生自我评价
2014/03/02 职场文书
公司任命书范本
2014/06/04 职场文书
离婚协议书该怎么写
2014/10/04 职场文书
事业单位财务人员岗位职责
2015/04/14 职场文书
师德师风培训感言
2015/08/03 职场文书
jquery插件实现图片悬浮
2021/04/16 jQuery