2019独角兽企业重金招聘Python工程师标准>>>

因前段时间去面试,问到如何高效向数据库插入10万条记录,之前没处理过类似问题,也没看过相关资料,结果没答上来,今天就查了些资料,总结出三种方法:

测试数据库为mysql!!!

方法一:

[java] view plain copy

  1. public static void insert() {
  2. // 开时时间
  3. Long begin = new Date().getTime();
  4. // sql前缀
  5. String prefix = "INSERT INTO tb_big_data (count, create_time, random) VALUES ";
  6. try {
  7. // 保存sql后缀
  8. StringBuffer suffix = new StringBuffer();
  9. // 设置事务为非自动提交
  10. conn.setAutoCommit(false);
  11. // Statement st = conn.createStatement();
  12. // 比起st,pst会更好些
  13. PreparedStatement pst = conn.prepareStatement("");
  14. // 外层循环,总提交事务次数
  15. for (int i = 1; i <= 100; i++) {
  16. // 第次提交步长
  17. for (int j = 1; j <= 10000; j++) {
  18. // 构建sql后缀
  19. suffix.append("(" + j * i + ", SYSDATE(), " + i * j
  20. * Math.random() + "),");
  21. }
  22. // 构建完整sql
  23. String sql = prefix + suffix.substring(0, suffix.length() - 1);
  24. // 添加执行sql
  25. pst.addBatch(sql);
  26. // 执行操作
  27. pst.executeBatch();
  28. // 提交事务
  29. conn.commit();
  30. // 清空上一次添加的数据
  31. suffix = new StringBuffer();
  32. }
  33. // 头等连接
  34. pst.close();
  35. conn.close();
  36. } catch (SQLException e) {
  37. e.printStackTrace();
  38. }
  39. // 结束时间
  40. Long end = new Date().getTime();
  41. // 耗时
  42. System.out.println("cast : " + (end - begin) / 1000 + " ms");
  43. }

输出时间:cast : 23 ms

该方法目前测试是效率最高的方法!

方法二:

[java] view plain copy

  1. public static void insertRelease() {
  2. Long begin = new Date().getTime();
  3. String sql = "INSERT INTO tb_big_data (count, create_time, random) VALUES (?, SYSDATE(), ?)";
  4. try {
  5. conn.setAutoCommit(false);
  6. PreparedStatement pst = conn.prepareStatement(sql);
  7. for (int i = 1; i <= 100; i++) {
  8. for (int k = 1; k <= 10000; k++) {
  9. pst.setLong(1, k * i);
  10. pst.setLong(2, k * i);
  11. pst.addBatch();
  12. }
  13. pst.executeBatch();
  14. conn.commit();
  15. }
  16. pst.close();
  17. conn.close();
  18. } catch (SQLException e) {
  19. e.printStackTrace();
  20. }
  21. Long end = new Date().getTime();
  22. System.out.println("cast : " + (end - begin) / 1000 + " ms");
  23. }

注:注释就没有了,和上面类同,下面会有分析!

控制台输出:cast : 111 ms

执行时间是上面方法的5倍!

方法三:

[java] view plain copy

  1. public static void insertBigData(SpringBatchHandler sbh) {
  2. Long begin = new Date().getTime();
  3. JdbcTemplate jdbcTemplate = sbh.getJdbcTemplate();
  4. final int count = 10000;
  5. String sql = "INSERT INTO tb_big_data (count, create_time, random) VALUES (?, SYSDATE(), ?)";
  6. jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
  7. // 为prepared statement设置参数。这个方法将在整个过程中被调用的次数
  8. public void setValues(PreparedStatement pst, int i)
  9. throws SQLException {
  10. pst.setLong(1, i);
  11. pst.setInt(2, i);
  12. }
  13. // 返回更新的结果集条数
  14. public int getBatchSize() {
  15. return count;
  16. }
  17. });
  18. Long end = new Date().getTime();
  19. System.out.println("cast : " + (end - begin) / 1000 + " ms");
  20. }

该方法采用的是spring batchUpdate执行,因效率问题,数据量只有1万条!

执行时间:cast : 387 ms

总结:方法一和方法二很类同,唯一不同的是方法一采用的是“insert into tb (...) values(...),(...)...;”的方式执行插入操作,

方法二则是“insert into tb (...) values (...);insert into tb (...) values (...);...”的方式,要不是测试,我也不知道两者差别是如此之大!

当然,这个只是目前的测试,具体执行时间和步长也有很大关系!如过把步长改为100,可能方法就要几分钟了吧,这个可以自己测试哈。。。

方法三网上很推崇,不过,效率大家也都看到了,1万条记录,耗时6分钟,可见其效率并不理想!而且方法三需要配置spring applicationContext环境才能应用!

不过,方法三在ssh/spring-mvc中可用性还是很高的!

刚才开始研究大数据方面的问题,以上也只是真实测试的结果,并不一定就是事实,有好的建议,大家请指正,谢谢!

相互学习,才能进步更快!

晚点会把源码发上来,大家可以直接去下载测试!

转载于:https://my.oschina.net/u/1018004/blog/1571241

关于批量插入数据之我见(100万级别的数据,mysql)相关推荐

  1. php 100万数据,关于批量插入数据之我见(100万级别的数据,mysql)

    关于批量插入数据之我见(100万级别的数据,mysql) ~~~ $dsn = 'mysql:host=localhost;dbname=test'; $db = new PDO($dsn,'root ...

  2. 关于批量插入数据之我见(100万级别的数据,mysql) (转)

    因前段时间去面试,问到如何高效向数据库插入10万条记录,之前没处理过类似问题,也没看过相关资料,结果没答上来,今天就查了些资料,总结出三种方法: 测试数据库为MySQL!!! 方法一: [java] ...

  3. sql server批量插入数据库的操作100万条数据

    1.数据库中 首先创建表->连接数据库->通过循环插入数据 2.建立测试表 在这里插入代码[c-sharp] view plain copy --Create DataBase creat ...

  4. mysql批量写入100万数据_Mysql数据库实践操作之————批量插入数据(100万级别的数据)-阿里云开发者社区...

    第一种方法:使用insert into 插入 从Redis每次获取100条数据,根据条件去插入到Mysql数据库中: 条件: 如果当前队列中的值大于1000条,则会自动的条用该方法,该方法每次获取从队 ...

  5. java 倒序分页_翻动100万级的数据(自定义的MSSQL分页查询过程)

    翻动 100 万级的数据 -- 只需几十毫秒 之揭秘篇:有详细的说明,不要错过. 感谢大家的支持!!! 昨天发了一个邀请,邀请大家帮忙测试,效果还可以,下面小结一下: 通过内部的计数器得知:访问次数是 ...

  6. QGIS一键加载100万基础地理信息数据导出

    上篇文章我们介绍了2021版1:100万基础地理信息数据的更新与数据下载,但是数据下载的方式需要我们我们到网站去注册账号并申请下载,分幅下载之后数据是分幅的GDB,需要全国的数据,需要将77个GDB批 ...

  7. ArcGIS接边整理合并的1:100万基础地理信息数据

    01 前言 前面我们介绍了<2021版1:100万基础地理信息数据更新(数据整理GDB批量合并)>.<QGIS一键加载100万基础地理信息数据导出>两篇文章,相信大家对这个数据 ...

  8. 总奖金100万!大数据赛事来了

    Datawhale赛事 主办方:江苏省工业和信息化厅.无锡市人民政府 大赛主题 SEED2021 汇数据价值  创数字未来 围绕车联网.医疗卫生.智慧水利.数字文娱等领域,深度挖掘省市务数据价值,探索 ...

  9. 如何通过Dataphin构建数据中台新增100万用户?

    欢迎来到数据中台小讲堂!这一期我们来看看,作为阿里巴巴数据中台(OneData - OneModel.OneID.OneService)方法论的产品载体,Dataphin如何帮助传统零售企业实现数字化 ...

最新文章

  1. 10篇一作SCI博士的走心分享--宏组学研究之“道”
  2. Oracle Dataguard 主备库的切换方法
  3. Redis常用命令之操作Set(集合)
  4. 3Dslicer1:入门及基本控制
  5. LeetCode_每日一题今日份_343.整除拆分
  6. iphone各机型参数对比_我们对比新旧两代iPhone,发现iPhone 12最值得买
  7. Apache配置静态缓存
  8. dell t40 固态系统盘_笔记本怎么安装固态硬盘 笔记本安装固态硬盘教程【详解】...
  9. python怎么解压_Python-解压缩的方法
  10. python实现命令行工具jq的json路径过滤
  11. NYOJ 93 汉诺塔(三) 【栈的简单应用】
  12. 获取TrustedInstaller权限
  13. wc与xargs命令
  14. 你连如何高效学习都不会,怎么提升编程水平呢!
  15. 访存模式分析实验思路(毕设笔记9)
  16. 微信推出热搜排行榜,微博压力山大?
  17. 短文本分类:电力95598工单分类实现
  18. 杂七杂八的网络安全知识
  19. 不要在学习启动管理器和元编程上浪费时间
  20. 生活随记 - 惋惜卡哇伊

热门文章

  1. android mvc使用方法,详细学习android mvc设计模式教程
  2. doxygen生成html文件,doxygen 的安装、配置、编译及使用(从源代码到文档)
  3. mysql字段是否存在_mysql判断列是否存在
  4. curl socket 访问_使用Curl、socket、file_get_contents三种方法POST提交数据 | 学步园
  5. oracle中的存储过程教程,oracle 存储过程
  6. python三引号解析_[宜配屋]听图阁
  7. 修改oracle数据连接数据库,如何修改oracle数据库的连接数
  8. 工况密度和标况密度怎么换算_什么是载流量?导线的载流量与电流密度怎么计算?图文详解!...
  9. 正确使用计算机说课稿,《初识计算机》说课稿
  10. kafka多个消费者消费一个topic_kafka:一文读懂消费者背后的那点quot;猫腻quot;