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优化之如何写出高质量sql语句
May 17 MySQL
Mysql数据库命令大全
May 26 MySQL
MySQL 数据类型选择原则
May 27 MySQL
Mysql实现主从配置和多主多从配置
Jun 02 MySQL
MySQL命令无法输入中文问题的解决方式
Aug 30 MySQL
基于MySql验证的vsftpd虚拟用户
Nov 07 MySQL
Mysql存储过程、触发器、事件调度器使用入门指南
Jan 22 MySQL
千万级用户系统SQL调优实战分享
Mar 03 MySQL
MySQL之MyISAM存储引擎的非聚簇索引详解
Mar 03 MySQL
浅谈如何保证Mysql主从一致
Mar 13 MySQL
MySQL 数据表操作
May 04 MySQL
MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
May 08 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
利用文件属性结合Session实现在线人数统计
2006/10/09 PHP
建立文件交换功能的脚本(一)
2006/10/09 PHP
PHP 中文乱码解决办法总结分析
2009/07/30 PHP
用PHP获取Google AJAX Search API 数据的代码
2010/03/12 PHP
php的memcached客户端memcached
2011/06/14 PHP
解析php中die(),exit(),return的区别
2013/06/20 PHP
php实现俄罗斯乘法实例
2015/03/07 PHP
PHP读取大文件末尾N行的高效方法推荐
2016/06/03 PHP
分享几种好用的PHP自定义加密函数(可逆/不可逆)
2020/09/15 PHP
js自带函数备忘 数组
2006/12/29 Javascript
JavaScript的Cookies
2008/01/16 Javascript
比Jquery的document.ready更快的方法
2010/04/28 Javascript
分享精心挑选的23款美轮美奂的jQuery 图片特效插件
2012/08/14 Javascript
js indexOf()定义和用法
2012/10/21 Javascript
如何用ajax来创建一个XMLHttpRequest对象
2012/12/10 Javascript
jquery中的常用事件bind、hover、toggle等示例介绍
2014/07/21 Javascript
jQuery验证插件 Validate详解
2014/11/20 Javascript
JavaScript实现隐藏省略文字效果的方法
2017/04/27 Javascript
JS实现的RC4加密算法示例
2018/08/16 Javascript
JavaScript自定义超时API代码实例
2020/04/30 Javascript
Python爬取Coursera课程资源的详细过程
2014/11/04 Python
基于python的七种经典排序算法(推荐)
2016/12/08 Python
Python中is与==判断的区别
2017/03/28 Python
浅谈python写入大量文件的问题
2018/11/09 Python
python 接收处理外带的参数方法
2018/12/03 Python
python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5
2020/12/01 Python
Bench加拿大官方网站:英国城市服装品牌
2017/11/03 全球购物
详细的大学生创业计划书模板
2014/01/27 职场文书
结婚周年感言
2014/02/24 职场文书
技术总监管理职责范本
2014/03/06 职场文书
加油口号大全
2014/06/13 职场文书
党性教育心得体会
2014/09/03 职场文书
先进个人事迹材料
2014/12/29 职场文书
党支部评议意见
2015/06/02 职场文书
MySQL分区路径子分区再分区
2022/04/13 MySQL
Win11无法安装更新补丁KB3045316怎么办 附KB3045316补丁修复教程
2022/08/14 数码科技