2016-09-20 118 views
0

問候支持社區,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

回答

0

你問(在評論中)如何連接你的文件。這將是

cat /tmp/*test1* 

但顯然你真的想從每個忽略的第一行:

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

如何使從標準輸入讀取你的SQL版本是超出了我的能力。如果你不能,也許將輸出保存到一個臨時文件,然後處理它。

如果你得到「參數列表太長」也許嘗試

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

-maxdepth 1說沒有下降到子目錄;如果這不是你想要的,就把它拿出來。

帶加號的-exec可能不適用於真正舊的系統;如果你遇到語法錯誤(儘管可能會有一個相當不愉快的性能損失),請嘗試使用\;

我沒有看到變量使得任何事物變得更清晰,更容易,更具可讀性或更易於維護,所以我只是將它們取出來。