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 14 MySQL
如何设计高效合理的MySQL查询语句
May 26 MySQL
MySQL系列之十五 MySQL常用配置和性能压力测试
Jul 02 MySQL
MySQL一些常用高级SQL语句
Jul 03 MySQL
mysql备份策略的实现(全量备份+增量备份)
Jul 07 MySQL
MySQL中utf8mb4排序规则示例
Aug 02 MySQL
一文带你探究MySQL中的NULL
Nov 11 MySQL
MySQL利用UNION连接2个查询排序失效详解
Nov 20 MySQL
Arthas排查Kubernetes中应用频繁挂掉重启异常
Feb 28 MySQL
MySQL创建管理HASH分区
Apr 13 MySQL
Mysql排查分析慢sql之explain实战案例
Apr 19 MySQL
MySQL数据库如何查看表占用空间大小
Jun 10 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
实例(Smarty+FCKeditor新闻系统)
2007/01/02 PHP
关于PHP的curl开启问题探讨
2014/04/08 PHP
PHP使用range协议实现输出文件断点续传代码实例
2014/07/04 PHP
Yii2框架RESTful API 格式化响应,授权认证和速率限制三部分详解
2016/11/10 PHP
一个轻量级的javascript库 pj介绍
2010/12/19 Javascript
jquery tab插件精简版分享
2011/09/10 Javascript
浅析javascript中的事件代理
2015/11/06 Javascript
AngularJS基础 ng-disabled 指令详解及简单示例
2016/08/01 Javascript
jQuery插件HighCharts实现的2D堆条状图效果示例【附demo源码下载】
2017/03/14 Javascript
BootStrap的两种模态框方式
2017/05/10 Javascript
vue之nextTick全面解析
2017/05/17 Javascript
Angular实现可删除并计算总金额的购物车功能示例
2017/12/26 Javascript
Angular2整合其他插件的方法
2018/01/20 Javascript
javascript实现手动点赞效果
2019/04/09 Javascript
如何换个角度使用VUE过滤器详解
2019/09/11 Javascript
[02:58]魔廷新尊——痛苦女王至宝语音台词节选
2020/06/14 DOTA
python益智游戏计算汉诺塔问题示例
2014/03/05 Python
从零学python系列之教你如何根据图片生成字符画
2014/05/23 Python
python实现根据窗口标题调用窗口的方法
2015/03/13 Python
python实现登陆知乎获得个人收藏并保存为word文件
2015/03/16 Python
matplotlib给子图添加图例的方法
2018/08/03 Python
python实现键盘控制鼠标移动
2020/11/27 Python
使用django和vue进行数据交互的方法步骤
2019/11/11 Python
Django 博客实现简单的全文搜索的示例代码
2020/02/17 Python
ASP.NET Core中的配置详解
2021/02/05 Python
基于Canvas+Vue的弹幕组件的实现
2019/07/23 HTML / CSS
马来西亚航空官方网站:Malaysia Airlines
2017/07/28 全球购物
蔻驰西班牙官网:COACH西班牙
2019/01/16 全球购物
EJB面试题
2015/07/28 面试题
面临毕业的毕业生自荐书范文
2014/02/05 职场文书
工作态度检讨书
2014/02/11 职场文书
团委竞选演讲稿
2014/04/24 职场文书
领导干部四风问题自我剖析材料
2014/09/25 职场文书
房屋租赁委托书范本
2014/10/04 职场文书
《中国古代诗歌散文欣赏》高中语文教材
2019/08/20 职场文书
DBCA命令行搭建Oracle ADG的流程
2021/06/11 Oracle