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数据将不胜感激。
谢谢!
答
你问(在评论中)如何连接你的文件。这将是
cat /tmp/*test1*
但显然你真的想从每个忽略的第一行:
awk 'FNR>1' /tmp/*test1*
如何使从标准输入读取你的SQL版本是超出了我的能力。如果你不能,也许将输出保存到一个临时文件,然后处理它。
如果你得到“参数列表太长”也许尝试
find /tmp -maxdepth 1 -type f -name '*test1*' -exec awk 'FNR>1' {} +
的-maxdepth 1
说没有下降到子目录;如果这不是你想要的,就把它拿出来。
带加号的-exec
可能不适用于真正旧的系统;如果你遇到语法错误(尽管可能会有一个相当不愉快的性能损失),请尝试使用\;
。
我没有看到变量使得任何事物变得更清晰,更容易,更具可读性或更易于维护,所以我只是将它们取出来。
如果建议在处理之前连接文件,我将如何有效连接1000万个文件?谢谢! – user3567212
什么操作系统?他们都在一个目录中吗?另外,为什么文件包含1行?哦,'/ tmp',Linux。 – Drew
CentOS 7.他们都在一个目录中。谢谢!! – user3567212