2012-02-14 7 views
1

、私はawk -F'|' '{print $1;}' file.csv > file2.csvmysqlのスクリプトbashのループ

を行う際

479856252|1329148400996|1329148405406|1329148412444|0|6042292534|6042292534|14016487697|0|6 
479856262|1329148401487|1329148405287|1329148412444|0|6136992594|6136992594|14016487697|0|6 
479856272|1329148405124|1329148405124|1329148412470|0|8883398128||4016487697|0||P|0|7 
479856282|1329148114930|1329148117966|1329148412502|0|8006564132|8779918502|7657954163|2609 

私は次の表IDを取得

12345 
67891 
32234 
22345 
12345 

私はループの持っていますこれはこのように動作します

for i in `cat file2.cvs` 
do 
DELETE FROM TABLE1 WHERE ID = $i 
done 

しかし、これは私のボックスに高負荷を発生させる、私は(file2.csvから100レコードごとに)操作を分割して、削除を実行してから1秒間スリープしてファイルの終わりまで。

お手数をおかけしますようお願い申し上げます。

は100人ごと削除した後、1秒間眠っよりもむしろあなた

+0

これまでの内容を表示できますか? – Dan

+0

あなたは 'DELETE FROM mytable WHERE ID IN(12345,67891、...)'のようなものをそれぞれ100個のIDのブロックで実行したいと思っていると思いますか? –

+7

あなたは一度にmysqlの一時テーブルにそれらをロードしてから、awk/perl/bashで終わるのではなく、削除するIDのソースとして使ってください。 –

答えて

-1

をありがとう、あなたの既存のファイル構造を維持し、それぞれが基本的に同じことを達成するために削除した後だけで0.01秒間眠ることができました。このような

何か:

for i in `cat file2.cvs` 
do 
    mysql -e "DELETE FROM TABLE1 WHERE ID = ${i};" 
    sleep .01 
done 
0

1つのSQLコマンドでそれを実行します。

DELETE FROM TABLE1 WHERE ID in (`cat file2.cvs | tr '\n' ','` -1) 

-1末尾にカンマに対応するためです。入力ファイルに最後の行に改行がない場合は、-1は必要ありません。

-1

補助変数を使用してループ数をカウントするだけです。

j=0 
for i in `cat file2.cvs` 
do 

    if [ $j -eq 100 ] 
    then 
     sleep 1 
     j=0 
    fi   

    j=$[ j+1 ] 
done 
関連する問題