MySQL的 - 从LOCAL INFILE LOAD DATA - 如何提高性能

问题描述:

问候支持社区,MySQL的 - 从LOCAL INFILE LOAD DATA - 如何提高性能

我有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数据将不胜感激。

谢谢!

+0

如果建议在处理之前连接文件,我将如何有效连接1000万个文件?谢谢! – user3567212

+0

什么操作系统?他们都在一个目录中吗?另外,为什么文件包含1行?哦,'/ tmp',Linux。 – Drew

+0

CentOS 7.他们都在一个目录中。谢谢!! – user3567212

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

cat /tmp/*test1* 

但显然你真的想从每个忽略的第一行:

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

如何使从标准输入读取你的SQL版本是超出了我的能力。如果你不能,也许将输出保存到一个临时文件,然后处理它。

如果你得到“参数列表太长”也许尝试

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

-maxdepth 1说没有下降到子目录;如果这不是你想要的,就把它拿出来。

带加号的-exec可能不适用于真正旧的系统;如果你遇到语法错误(尽管可能会有一个相当不愉快的性能损失),请尝试使用\;

我没有看到变量使得任何事物变得更清晰,更容易,更具可读性或更易于维护,所以我只是将它们取出来。