问候支持社区,
我尝试使用以下脚本将大约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 :(得分: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>
。
我没有看到变量变得更清晰,更容易,更易读或更具可维护性,所以我只是将它们拿出来。