插入大数据量方法-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文件;执行方案三时要倒序执行每个分割文件,每个分割文件也要倒序读取转换。

你可能感兴趣的:(java,database)