2009-05-10 8 views
0

アップロードされたCVSファイルから100000-500000行程度のdbテーブルを更新する必要があるときにバッチ処理があります。通常は20〜30分かかります。PHPで長時間バッチ処理を行うには?

どうすればよいですか?それに関する良い練習ですか?どんな提案も評価されます

ありがとうございます。

+0

あなたはもう一度質問を読んで、あなたは*実際に* MySQLを最初に使っていますか? – Tomalak

答えて

1

多くの挿入を行っている場合は、一括挿入していますか?つまり、次のようになります。

INSERT INTO table (col1 col2) VALUES (val1a, val2a), (val1b, val2b), (.... 

これにより、挿入速度が大幅に向上します。

もう1つのことは、変更を加えている間はインデックスを無効にして、完了したらインデックスを一度に再構築できるようにすることです。

あなたが最適化することができますので、あなたのコードの最も遅い部分を見つけるのを助けることができるBenchmark_Profilerクラスを持っているBenchmarkと呼ばれるパッケージを持って何をやっていると、あなたはより多くのアイデア

1

PEARを取得する可能性がありますについてもう少し詳しく。

1

大きなアプリケーションでは、このような機能がありました。 csvから9つのインデックスを持つテーブルに何百万行も挿入するという問題がありました。多くのリファクタリングの後に、データを挿入する理想的な方法は、mysql LOAD DATA INFILEコマンドを使用して[一時]テーブルにロードすることでした。そこで変換を行い、複数の挿入クエリを含む結果を実際のテーブル(INSERT INTO ... SELECT FROM) 1回の挿入でYMMVを発行するよりもパフォーマンスが優れています。

+0

Damn。あなたは私にそれを打つ。:) +1 – Tomalak

7

CSVから500.000行をインポートするのに30分かかりますか?

あなたはMySQLが苦労していると考えましたか? CSVファイルを扱うサポートLOAD DATA INFILEは、あります:

LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name 
    FIELDS TERMINATED BY ',' ENCLOSED BY '"' 
    LINES TERMINATED BY '\n'; 

ファイルはかなり右ターゲット表にインポートする権利形状でない場合は、事前にそれを変換するためにPHPを使用するか、またはそれをロードしますか「ステージング」テーブルに入れて、MySQLが必要な変換を処理させるようにしてください。—どちらか速くて便利です。

追加オプションとして、MySQL Native Driver for PHP (MYSQLND)でMySQLクエリを非同期に実行する可能性があるようです。多分あなたはそのオプションも探検することができます。これは、あなたがうまくいくUIのパフォーマンスを保持することができます。

+0

それはバッチプロセスで私は他の関連するテーブルを更新する必要がありますが、挿入、更新、アプリケーションのステータス、支払いトランザクション、それは本当に長い時間がかかります、私はいくつかのコードロジックを行う必要があります、関連テーブルのレコードをいくつか作成し、顧客に通知します(電子メールメッセージをメールキューに入れます)。だから、私はちょうどバックグラウンドプロセスとして実行し、仕事を終了する時間がかかるようにPHPのexecでそれを行うにはthinkign。私はcronでこれを行うことはできません。これはユーザーコントロールの下にあります。ユーザーがプロセスのボタンをクリックし、後でログをチェックしてプロセスの状態を確認できます。 お返事ありがとうTomalak。 – taras

+0

これは今、mysqlについてですperformace =それはmysql performaceについてではありません – taras

+1

私は参照してください。私はどこか非効率であると想定していましたが、それは多くの仕事がある場合よりも自然に時間がかかります。がんばろう! :) – Tomalak

0

私は、これはユーザーの制御下にあるだって、クーロンでそれを行うユーザクリックプロセスボタンとユーザー押すボタンは、設定された場合は、後のプロセスの状態

を見るためにログをチェックすることができカントデータベース内のテーブルのフラグ。次に、あなたのcronジョブがこのフラグをチェックするようにしてください。存在する場合は処理を開始し、そうでない場合は処理を開始します。可能であれば、同じテーブルを使用して何らかのステータス更新(例:xx%done)を投稿することができます。そのため、ユーザーは進捗状況についていくつかのフィードバックを得ます。

関連する問題