作者:ksfzhaohui

最近有个需求解析一个订单文件,并且说明文件可达到千万条数据,每条数据大概在20个字段左右,每个字段使用逗号分隔,需要尽量在半小时内入库。

思路

1.估算文件大小

因为告诉文件有千万条,同时每条记录大概在20个字段左右,所以可以大致估算一下整个订单文件的大小,方法也很简单使用FileWriter往文件中插入一千万条数据,查看文件大小,经测试大概在1.5G左右;

2.如何批量插入

由上可知文件比较大,一次性读取内存肯定不行,方法是每次从当前订单文件中截取一部分数据,然后进行批量插入,如何批次插入可以使用insert(...)values(...),(...)的方式,经测试这种方式效率还是挺高的;


3.数据的完整性

截取数据的时候需要注意,需要保证数据的完整性,每条记录最后都是一个换行符,需要根据这个标识保证每次截取都是整条数,不要出现半条数据这种情况;

4.数据库是否支持批次数据

因为需要进行批次数据的插入,数据库是否支持大量数据写入,比如这边使用的mysql,可以通过设置max_allowed_packet来保证批次提交的数据量;

5.中途出错的情况

因为是大文件解析,如果中途出现错误,比如数据刚好插入到900w的时候,数据库连接失败,这种情况不可能重新来插一遍,所有需要记录每次插入数据的位置,并且需要保证和批次插入的数据在同一个事务中,这样恢复之后可以从记录的位置开始继续插入。

实现

1.准备数据表

这里需要准备两张表分别是:订单状态位置信息表,订单表;

2.配置数据库包大小

通过设置max_allowed_packet,保证数据库能够接收批次插入的数据包大小;不然会出现如下错误:

3.准备测试数据

使用FileWriter遍历往一个文件里插入1000w条数据即可,这个速度还是很快的,不要忘了在每条数据的后面添加换行符()

4.截取数据的完整性

除了需要设置每次读取文件的大小,同时还需要设置一个参数,用来每次获取一小部分数据,从这小部分数据中获取换行符(),如果获取不到一直累加直接获取为止,这个值设置大小大致同每条数据的大小差不多合适,部分实现如下:

如上代码所示开辟了一个缓冲区,根据每行数据大小来定大概在200字节左右,然后通过遍历查找换行符(),找到以后将当前的位置加到之前的结束位置上,保证了数据的完整性;

5.批次插入数据

通过insert(...)values(...),(...)的方式批次插入数据,部分代码如下:

如上代码在一个事务中同时保存批次订单数据和文件解析位置信息,batchInsert通过使用mybatis的标签来遍历订单列表,生成values数据;

总结

以上展示了部分代码,完整的代码可以查看Github地址中的batchInsert模块,本地设置每次截取的文件大小为2M,经测试1000w条数据(大小1.5G左右)插入mysql数据库中,大概花费时间在20分钟左右,当然可以通过设置截取的文件大小,花费的时间也会相应的改变。

完整代码:https://github.com/ksfzhaohui/blog/tree/master/mybatis

insert批量插入500ms_如何快速安全的插入千万条数据相关推荐

  1. 如何快速安全的插入千万条数据?

    最近有个需求解析一个订单文件,并且说明文件可达到千万条数据,每条数据大概在20个字段左右,每个字段使用逗号分隔,需要尽量在半小时内入库. 思路 1.估算文件大小 因为告诉文件有千万条,同时每条记录大概 ...

  2. mysql如何快速插入一千万条数据_如何快速安全的插入千万条数据?

    最近有个需求解析一个订单文件,并且说明文件可达到千万条数据,每条数据大概在20个字段左右,每个字段使用逗号分隔,需要尽量在半小时内入库. 思路 1.估算文件大小 因为告诉文件有千万条,同时每条记录大概 ...

  3. mysql插10万条数据_如何快速安全的插入千万条数据?

    点击上方 小伟后端笔记 ,选择 星标 公众号 重磅资讯.干货,第一时间送达 最近有个需求解析一个订单文件,并且说明文件可达到千万条数据,每条数据大概在20个字段左右,每个字段使用逗号分隔,需要尽量在半 ...

  4. MySQL 快速批量创建千万条数据 千万级数据

     MySQL 快速批量创建千万条数据 千万级数据 一.实现思路 1.创建一张users表,数据库引擎调整为: MyISAM 2.使用存储过程实现,用循环语句,批量插入1kw次.( WHILE ... ...

  5. Java千万数据导入mysql_java之5分钟插入千万条数据

    虽说不一定5分钟就插入完毕,因为取决去所插入的字段,如果字段过多会稍微慢点,但不至于太慢.10分钟内基本能看到结果. 之前我尝试用多线程来实现数据插入(百万条数据),半个多小时才二十多万条数据. 线程 ...

  6. 使用MySQL可视化客户端,例如SQLyog,Navicat等,只编写SQL语句,使用2的N次方原理,快速初始化百万千万条数据

    目录 1.思路 2.创建表 3.具体操作 4.其他快速插入百万条数据的方法 4.1Java代码批量插入 4.2存储过程批量插入 1.思路 使用MySQL可视化客户端,例如SQLyog,Navicat ...

  7. 千万条数据,Stack Overflow是如何实现快速分页的

    转载自 千万条数据,Stack Overflow是如何实现快速分页的 Stack Overflow 在分页机制中使用页码代替偏移量,页码指向基于 LIMIT 和 OFFSET 的查询.假设要对 100 ...

  8. Mysql中一千万条数据怎么快速查询

    文章来源: 学习通http://www.bdgxy.com/ 目录 普通分页查询 如何优化 偏移量大 采用id限定方式 优化数据量大问题 普通分页查询 当我们在日常工作中遇到大数据查询的时候,第一反应 ...

  9. 一千万条数据,怎么快速查询

    一千万条数据怎么快速查询 普通分页查询 ​ 当我们在日常工作中遇到大数据查询的时候,第一反应就是使用分页查询. mysql支持limit语句来选取指定的条数数据,而oracle可以使用rownum来选 ...

最新文章

  1. 这篇文章,或许可以改善你的不快乐。
  2. Linux学习(十)---网络配置
  3. 【F#2.0系列】介绍String类型
  4. Python之美[从菜鸟到高手]--一步一步动手给Python写扩展(异常处理和引用计数)
  5. java ug二次开发_使用Java进行UG二次开发:简单的例子(上) | 学步园
  6. 使用SharePoint 2007 Web Service上传文件到文档库
  7. swift:简单使用翻页控制器UIPageViewController
  8. helm3添加harbor仓库:带鉴权--username --password
  9. MySQL的登陆错误:ERROR 1049 (42000): Unknown database 'yht'
  10. c 加密 java解密错误_google协议缓冲区-用C加密,用Java解密-InvalidProtocolBufferException...
  11. 深入理解.NET Core的基元: deps.json, runtimeconfig.json, dll文件
  12. macOS如何使用命令启动服务/停止服务/查看服务
  13. C# Attribute(中)——Attribute本质论
  14. 手机连接电脑wifi上网_手机设置无线路由器方法教你一分钟学会WIFI上网(无需电脑)...
  15. 怎样输出矩阵乘积C语言,c语言矩阵相乘
  16. 飘云阁(PYG)番茄插件流氓弹窗清除方法
  17. 【前端词典】进阶必备的网络基础
  18. 【Mark】转正述职答辩
  19. 元子弹老师-吉他指弹泛音
  20. FPGA--OV7725摄像头采集与VGA显示实验--1--OV7725使用与驱动协议

热门文章

  1. 2020 年 5 大 DevOps 趋势
  2. Apache Commons Fileupload 漏洞,可恶意操作文件
  3. 史上最易懂的Kubernetes儿童插图指南
  4. linux 并行计算命令,Linux下的并行神器——parallel
  5. 中南财经政法大学计算机考研难吗,中南财经政法大学考研难吗(考研难度分析)...
  6. matlab 霍特林变换,数字图像处理(第3版面向CS2013计算机专业规划教材)
  7. osg linux 环境配置,Linux环境下jdk1.8的下载与安装
  8. TX2 安装QT Creator
  9. python判断对象是否有属性
  10. python 矩阵常用计算