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

时间:2016-09-20 18:32:35

标签: mysql bash file load

问候支持社区,

我尝试使用以下脚本将大约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中的建议都将非常感激。

谢谢!

1 个答案:

答案 0 :(得分:1)

您(如评论中)询问如何连接文件。那将是

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

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

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

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

如果你得到&#34;参数列表太长&#34;也许试试

-maxdepth 1

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

带有加号的\;可能在真正的旧系统上不可用;如果您遇到语法错误(尽管可能会有相当不愉快的性能损失),请尝试使用 <select id="year" name="year"> <c:forEach begin="1900" end="2016" var="val"> <c:set var="decr" value="${2016-val}"/> <option value="${decr}" ${birthYear == decr ? 'selected' : ''}>${decr}</option> </c:forEach> </select>

我没有看到变量变得更清晰,更容易,更易读或更具可维护性,所以我只是将它们拿出来。