私はデータの大きなCSVファイルのインポートに取り組んできました。通常、100,000レコード未満です。PHPとMySQL(InnoDBテーブル)を使用しています。PHPを使用していくつかのフィールドを変換し、MySQLの前にテキスト処理を行う必要がありました(以下のコードINSERT
の一部)。process_note_data()
MySQLLOAD DATA
は実現可能ではなかったので、提案しないでください。
私は最近、とを使用してMySQLトランザクションを使用することにより、このプロセスの速度を改善しようとしましSTART TRANSACTION
たCOMMIT
。パフォーマンスの向上は驚くべきものでした。処理時間は20分の1に短縮されました。したがって、20分のプロセスには約1分しかかかりませんでした。
質問。
1.)なぜこのようなパフォーマンスの向上(20分から1分)があったのか誰かが理解していますか?
2.)100,000レコードでトランザクションがどれだけ大きくなるかについて心配する必要がありますか?
3.)トランザクションでの多数の挿入や更新を考慮する必要がありますか?
/*
* Customer Notes Data:
* Rows are either a meeting, call or note!
*/
$row = 1;
$data = array();
$fields = array();
$line = '';
$db->query('SET autocommit=0;');
$db->query('START TRANSACTION;');
if (($handle = fopen("modules/".$currentModule."/Data/customernote.csv", "r")) !== FALSE) {
while (($data = fgetcsv($handle, 4096, ',', '"')) !== FALSE && $row < 999000) {
//Row 1 - CSV header row with field names
if ($row == 1) {
$csv_fields = $data;
} elseif ($row > 1) {
$fields = $this->process_note_data($data, $csv_fields, $row);
}
$row++;
} // end while
fclose($handle);
}
$db->query('COMMIT;');
$db->query('SET autocommit=1;');
注:テキスト/フィールド処理は呼び出しで実行され、呼び出し先はステートメントコード$this->process_note_data()
を持つ別のヘルパークラスを呼び出します。INSERT
すべてのコードを含めるのに十分なスペースがありませんでした。$db->query()
MySQLクエリの典型的なデータベースオブジェクトです。