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 时间类型的选择
Jun 05 MySQL
MySQL中order by的使用详情
Nov 17 MySQL
mysql分组后合并显示一个字段的多条数据方式
Jan 22 MySQL
Mysql Innodb存储引擎之索引与算法
Feb 15 MySQL
解决MySQL添加新用户-ERROR 1045 (28000)的问题
Mar 03 MySQL
解决Mysql中的innoDB幻读问题
Apr 29 MySQL
mysql查找连续出现n次以上的数字
May 11 MySQL
MySQL慢查询中的commit慢和binlog中慢事务的区别
Jun 16 MySQL
delete in子查询不走索引问题分析
Jul 07 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
自己动手做一个SQL解释器
2006/10/09 PHP
php下删除一篇文章生成的多个静态页面
2010/08/08 PHP
destoon实现首页显示供应、企业、资讯条数的方法
2014/07/15 PHP
php判断当前用户已在别处登录的方法
2015/01/06 PHP
PHP异常处理Exception类
2015/12/11 PHP
浅析Yii2 GridView 日期格式化并实现日期可搜索教程
2016/04/22 PHP
彪哥1.1(智能表格)提供下载
2006/09/07 Javascript
JS字符串处理实例代码
2013/08/05 Javascript
extjs_02_grid显示本地数据、显示跨域数据
2014/06/23 Javascript
JavaScript检测字符串中是否含有html标签实现方法
2015/07/01 Javascript
用NODE.JS中的流编写工具是要注意的事项
2016/03/01 Javascript
js中json处理总结之JSON.parse
2016/10/14 Javascript
浅谈html转义及防止javascript注入攻击的方法
2016/12/04 Javascript
bootstrap table单元格新增行并编辑
2017/05/19 Javascript
nodejs结合Socket.IO实现的即时通讯功能详解
2018/01/12 NodeJs
js get和post请求实现代码解析
2020/02/06 Javascript
AJAX XMLHttpRequest对象创建使用详解
2020/08/20 Javascript
[01:01:31]2018DOTA2亚洲邀请赛3月29日小组赛B组 Mineski VS paiN
2018/03/30 DOTA
Python实现的金山快盘的签到程序
2013/01/17 Python
Python实现桶排序与快速排序算法结合应用示例
2017/11/22 Python
python 按照固定长度分割字符串的方法小结
2018/04/30 Python
python-str,list,set间的转换实例
2018/06/27 Python
Python startswith()和endswith() 方法原理解析
2020/04/28 Python
python如何导入依赖包
2020/07/13 Python
Python子进程subpocess原理及用法解析
2020/07/16 Python
java关于string最常出现的面试题整理
2021/01/18 Python
详解CSS3的perspective属性设置3D变换距离的方法
2016/05/23 HTML / CSS
丝芙兰美国官网:SEPHORA美国
2016/08/03 全球购物
预订从美国飞往印度的机票:MyTicketsToIndia
2017/05/19 全球购物
一个精品风格的世界:Atterley
2019/05/01 全球购物
元宵节主持词
2014/03/25 职场文书
聘任书的写作格式及范文
2014/03/29 职场文书
房屋转让协议书
2014/10/18 职场文书
关于远足的感想
2015/08/10 职场文书
入党申请书格式
2019/06/20 职场文书
vite+vue3.0+ts+element-plus快速搭建项目的实现
2021/06/24 Vue.js