MySQL大批量数据导入

目标

千万行的的 json 数据或者 CSV 快速导入 MYSQL 的场景。

解决方案

脚本代码

使用 php / python 或者你熟悉的语言,按行解析,插入。

tips:

  1. 一次解析多行,提交效率
  2. 分组插入,减少 MySQL 插入次数
  3. 注意内存

每次解析的行数和每次插入的行数按具体情况 ,主要考虑运行内存和MySQL的压力情况。

load data

对于 CSV 我们可以直接使用 SQL,可以直接运行,或者配合其他脚本使用。

LOAD DATA LOCAL INFILE '/xxx.csv' 
INTO TABLE linkedin
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 LINES 
(@C1,@C2,@C3,@C4)
set company=@C1,
website=upper(@C2),
address=concat(@C3, "-",@C4),
imported_at=now(),
zip=if(now()<'1988-01-01','1','2');


LOAD DATA LOCAL INFILE '/13sai.json' 
INTO TABLE oscome
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n';

mysqlimport

对于 CSV 我们可以直接使用

./mysqlimport -u root -p --local  --delete --fields-terminated-by="," --lines-terminated-by="\r\n" --ignore-lines=1 --columns=company,website testdata  '/13sai.csv'

MySQL Shell

mysqlsh mysql://root:123456@127.0.0.1:3366 -- util import-table 13sai.json "data_b*" data_d.tsv.zst --schema=mydb --table=twitter --osBucketName=mybucket


mysql-py> util.import_table(["./13sai.csv"],{"schema":"testdata","table":"test","dialect":"csv","columns":[1,2,3,4,5,6,7,8,9,10,11,12],"decodeColumns":{"company":"@1","website":"@2","url":"@3","address":"@4","zip":"@5",},"skipRows":1,"showProgress":True,"threads": 3});


mysql-py> util.import_table(["./13sai.json.gz"],{"schema":"testdata","table":"twitter","dialect":"json","columns":[1,2,3,4,5,6,7,8,9,10,11,12],"decodeColumns":{"id":"@1","name":"@2"},"skipRows":1,"showProgress":True,"threads": 3});

总结

对于 CSV 或者格式化文本使用 mysqlimport、load data 都是不错的选择,而脚本解析是最有普适性的,假如需要打印日志、进度或者字段变更,使用 php/python 等去解析更为灵活。


MySQL大批量数据导入
https://github.13sai.com/2022/10/22/450/
作者
13sai
许可协议