アップロードされたCVSファイルから約100000〜500000行のdbテーブルを更新する必要がある場合、バッチプロセスがあります。通常は20〜30分かかりますが、それより長くかかることもあります。
最善の方法は何ですか?その上で何か良い習慣はありますか?任意の提案をいただければ幸いです
ありがとう。
アップロードされたCVSファイルから約100000〜500000行のdbテーブルを更新する必要がある場合、バッチプロセスがあります。通常は20〜30分かかりますが、それより長くかかることもあります。
最善の方法は何ですか?その上で何か良い習慣はありますか?任意の提案をいただければ幸いです
ありがとう。
CSVから500.000行をインポートするのに30分かかりますか?
MySQLに大変な仕事をさせることを検討しましたか?LOAD DATA INFILE
CSVファイルの処理をサポートするがあります。
LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n';
ファイルがターゲットテーブルに正しくインポートするのに適切な形でない場合は、PHPを使用して事前に変換するか、ファイルを「ステージング」テーブルにロードしてMySQLに必要な変換を処理させることができます。もっと便利。
追加オプションとして、 MySQLネイティブドライバーfor PHP(MYSQLND)を介してMySQLクエリを非同期で実行する可能性があるようです。たぶん、あなたもそのオプションを探索することができます。それはあなたがきびきびとしたUIパフォーマンスを維持することを可能にするでしょう。
たくさんの挿入をしている場合、一括挿入をしていますか?すなわちこのように:
INSERT INTO table (col1 col2) VALUES (val1a, val2a), (val1b, val2b), (....
これにより、インサートが劇的に高速化されます。
もう1つできることは、変更を行っている間はインデックス作成を無効にし、終了したら一度にインデックスを再構築できるようにすることです。
あなたがしていることについてもう少し詳細になり、あなたはより多くのアイデアを得るかもしれません
大きなアプリケーションでそのような機能がありました。csvから9つのインデックスを持つテーブルに数百万の行を挿入するという問題がありました。多くのリファクタリングの後、データを挿入する理想的な方法は、mysql LOAD DATA INFILEコマンドを使用して[一時]テーブルにデータをロードし、そこで変換を実行し、複数の挿入クエリを使用して結果を実際のテーブルにコピーすることでした(INSERT INTO ... SELECT FROM
)処理各クエリでわずか50k行程度(単一の挿入を発行するよりもパフォーマンスが優れていますが、YMMV)。
これはユーザーの制御下にあるので、cronではできません。ユーザーがプロセスボタンをクリックすると、後でログをチェックしてプロセスのステータスを確認できます
ユーザーがこのボタンを押すと、データベースのテーブルにフラグが設定されます。次に、cron ジョブでこのフラグをチェックします。そこにある場合は処理を開始し、そうでない場合は処理を開始しません。同じテーブルを使用して、ある種のステータス更新 (例: xx% 完了) を投稿できるため、ユーザーは進行状況について何らかのフィードバックを得ることができます。