insert批量插入500ms_如何快速安全的插入千万条数据
作者: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_如何快速安全的插入千万条数据相关推荐
- 如何快速安全的插入千万条数据?
最近有个需求解析一个订单文件,并且说明文件可达到千万条数据,每条数据大概在20个字段左右,每个字段使用逗号分隔,需要尽量在半小时内入库. 思路 1.估算文件大小 因为告诉文件有千万条,同时每条记录大概 ...
- mysql如何快速插入一千万条数据_如何快速安全的插入千万条数据?
最近有个需求解析一个订单文件,并且说明文件可达到千万条数据,每条数据大概在20个字段左右,每个字段使用逗号分隔,需要尽量在半小时内入库. 思路 1.估算文件大小 因为告诉文件有千万条,同时每条记录大概 ...
- mysql插10万条数据_如何快速安全的插入千万条数据?
点击上方 小伟后端笔记 ,选择 星标 公众号 重磅资讯.干货,第一时间送达 最近有个需求解析一个订单文件,并且说明文件可达到千万条数据,每条数据大概在20个字段左右,每个字段使用逗号分隔,需要尽量在半 ...
- MySQL 快速批量创建千万条数据 千万级数据
MySQL 快速批量创建千万条数据 千万级数据 一.实现思路 1.创建一张users表,数据库引擎调整为: MyISAM 2.使用存储过程实现,用循环语句,批量插入1kw次.( WHILE ... ...
- Java千万数据导入mysql_java之5分钟插入千万条数据
虽说不一定5分钟就插入完毕,因为取决去所插入的字段,如果字段过多会稍微慢点,但不至于太慢.10分钟内基本能看到结果. 之前我尝试用多线程来实现数据插入(百万条数据),半个多小时才二十多万条数据. 线程 ...
- 使用MySQL可视化客户端,例如SQLyog,Navicat等,只编写SQL语句,使用2的N次方原理,快速初始化百万千万条数据
目录 1.思路 2.创建表 3.具体操作 4.其他快速插入百万条数据的方法 4.1Java代码批量插入 4.2存储过程批量插入 1.思路 使用MySQL可视化客户端,例如SQLyog,Navicat ...
- 千万条数据,Stack Overflow是如何实现快速分页的
转载自 千万条数据,Stack Overflow是如何实现快速分页的 Stack Overflow 在分页机制中使用页码代替偏移量,页码指向基于 LIMIT 和 OFFSET 的查询.假设要对 100 ...
- Mysql中一千万条数据怎么快速查询
文章来源: 学习通http://www.bdgxy.com/ 目录 普通分页查询 如何优化 偏移量大 采用id限定方式 优化数据量大问题 普通分页查询 当我们在日常工作中遇到大数据查询的时候,第一反应 ...
- 一千万条数据,怎么快速查询
一千万条数据怎么快速查询 普通分页查询 当我们在日常工作中遇到大数据查询的时候,第一反应就是使用分页查询. mysql支持limit语句来选取指定的条数数据,而oracle可以使用rownum来选 ...
最新文章
- 这篇文章,或许可以改善你的不快乐。
- Linux学习(十)---网络配置
- 【F#2.0系列】介绍String类型
- Python之美[从菜鸟到高手]--一步一步动手给Python写扩展(异常处理和引用计数)
- java ug二次开发_使用Java进行UG二次开发:简单的例子(上) | 学步园
- 使用SharePoint 2007 Web Service上传文件到文档库
- swift:简单使用翻页控制器UIPageViewController
- helm3添加harbor仓库:带鉴权--username --password
- MySQL的登陆错误:ERROR 1049 (42000): Unknown database 'yht'
- c 加密 java解密错误_google协议缓冲区-用C加密,用Java解密-InvalidProtocolBufferException...
- 深入理解.NET Core的基元: deps.json, runtimeconfig.json, dll文件
- macOS如何使用命令启动服务/停止服务/查看服务
- C# Attribute(中)——Attribute本质论
- 手机连接电脑wifi上网_手机设置无线路由器方法教你一分钟学会WIFI上网(无需电脑)...
- 怎样输出矩阵乘积C语言,c语言矩阵相乘
- 飘云阁(PYG)番茄插件流氓弹窗清除方法
- 【前端词典】进阶必备的网络基础
- 【Mark】转正述职答辩
- 元子弹老师-吉他指弹泛音
- FPGA--OV7725摄像头采集与VGA显示实验--1--OV7725使用与驱动协议
热门文章
- 2020 年 5 大 DevOps 趋势
- Apache Commons Fileupload 漏洞,可恶意操作文件
- 史上最易懂的Kubernetes儿童插图指南
- linux 并行计算命令,Linux下的并行神器——parallel
- 中南财经政法大学计算机考研难吗,中南财经政法大学考研难吗(考研难度分析)...
- matlab 霍特林变换,数字图像处理(第3版面向CS2013计算机专业规划教材)
- osg linux 环境配置,Linux环境下jdk1.8的下载与安装
- TX2 安装QT Creator
- python判断对象是否有属性
- python 矩阵常用计算