MySQL - 从 LOCAL INFILE 加载数据 - 如何提高性能

MySQL - LOAD DATA from LOCAL INFILE - How to increase performance

问候支持社区,

我尝试使用以下脚本将大约 1000 万多个文件加载到 MySQL 数据库中:

WORKING_DIR=/tmp
FILE1="*test*"
timestamp_format="%Y-%m-%d %H:%i:%s.%x"

for i in ${WORKING_DIR}/${FILE1}
do
    if [ -f "$i" ]; then
    mysql -uroot -ptest my_database --local-infile=1<<-SQL
    SET sql_log_bin=0;
    LOAD DATA LOCAL INFILE '${i}' INTO TABLE my_table
    FIELDS TERMINATED BY ','
    OPTIONALLY ENCLOSED BY '\"'
    LINES  TERMINATED BY '\n'
    IGNORE 1 LINES
    (id, transaction_id, app_id, sub_id);
    SQL
    fi
done

这是一个极其缓慢的过程。大约 24 小时后,我只能加载大约 200 万条记录。在每个文件中,有一条记录。按照这个速度,这将在大约 5 天内完成。有更快的方法吗?例如。我应该在处理之前连接文件吗?

任何关于改进将此数据加载到 MySQL 的建议都将不胜感激。

谢谢!

你问(在评论中)如何连接你的文件。那将是

cat /tmp/*test1*

虽然显然你实际上想省略每行的第一行:

awk 'FNR>1' /tmp/*test1*

如何从标准输入中读取您的 SQL 版本超出了我的能力范围。如果不能,也许可以将输出保存到一个临时文件中,然后进行处理。

如果你得到 "argument list too long" 也许试试

find /tmp -maxdepth 1 -type f -name '*test1*' -exec awk 'FNR>1' {} +

-maxdepth 1表示不要进入子目录;如果那不是你想要的,就把它拿出来。

带加号的 -exec 在真正的旧系统上可能不可用;如果出现语法错误,请尝试使用 \; 代替它(尽管可能会有相当不愉快的性能损失)。

我没有看到这些变量使任何东西变得更清晰、更容易、更易读或更易于维护,所以我只是把它们去掉了。