插入大数据量方法-MySQL

背景

有一个4千万行的4列字段文件data.txt要插入数据库,假设表名为table_name,字段分别为A,B,C,D,其中每行唯一标识为A+B,文件里面有重复数据(根据A+B确定),需要保留行数大的记录。

解决方案

方案一:
1、表结构设计:设置A,B为联合主键;
2、逐行读取文件,插入前根据A+B判断是否有重复,有则更新,没有则插入。
方案二:
1、表结构设计:先不设置A,B为联合主键,增设id为自增主键;
2、逐行读取文件,拼接insert.sql文件,如‘INSERT INTO table_name (A, B, C, D) VALUES (‘AVALUE’, ‘BVALUE’, ‘CVALUE’, ‘DVALUE’);’
3、执行insert.sql脚本文件直接全部插入数据库;
4、根据A+B两个字段写SQL去重,可参考我的博客:MySQL根据某一个或者多个字段查找重复数据,并且保留某字段值最大的记录
5、把id字段去掉,导出需要的4列数据脚本insert-final.sql;
6、truncate table table_name;
7、设置A,B为联合主键,执行insert-final.sql文件。
方案三:
1、表结构设计:设置A,B为联合主键;
2、逐行读取文件,拼接insert.sql文件,如‘INSERT INTO table_name (A, B, C, D) VALUES (‘AVALUE’, ‘BVALUE’, ‘CVALUE’, ‘DVALUE’) on duplicate key update C=values(C), D=values(D);’
3、执行insert.sql脚本文件直接全部插入数据库;

比较

同样配置下
方案一 插入330行数据需要65s,时间N*N增长;
方案二 插入330万行数据需要248s,删除10万行重复数据需要80s,时间N增长。
方案三 插入330行数据需要0.142s,时间N增长。
方案一耗时 > 方案二耗时 > 方案三耗时 。

PS:遇到内存不够的话,通过split -b 100m data.txt -b -a 2 split_file 分割文件。
注意此时执行方案一要按照顺序执行每个分割的文件;执行方案二时逐个执行分割文件,逐个执行insert.sql文件;执行方案三时要倒序执行每个分割文件,每个分割文件也要倒序读取转换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值