UPDATE users SET column = 'value' WHERE id = 1 OR id = 2 OR id = 3 ... OR id = 50000
のようなクエリを作成することを考えている場合 またはWHERE id IN (1, 2, 3, ..., 50000)
それならおそらく大きすぎるでしょう。それを要約するロジックを作成できれば、クエリが短縮され、MySQL側の処理が大幅に高速化されます。たぶんあなたはそれをWHERE id >= 1 AND id <= 50000
にすることができます 。
それがオプションでない場合は、バーストで行うことができます。おそらく、CSVファイルの行をループして、大きなWHERE id = 1 OR id = 2...
としてクエリを作成します。 クエリを実行し、100行程度(またはそれでも大きすぎる場合は50行)ごとにクエリを実行して、次の50IDに対して新しいクエリを開始します。
または、50.000個のシングルUPDATE
を実行することもできます データベースに対するクエリ。正直なところ、テーブルがインデックスを適切に使用している場合、ほとんどの最新のWebサーバーでは50.000クエリの実行に数秒しかかかりません。最も忙しいサーバーでさえ、1分以内にそれを処理できるはずです。
ファイルをチャンクで読み取る場合は、PHPの基本的なファイルアクセス関数を使用できます。
$file = fopen('/path/to/file.csv', 'r');
// read one line at a time from the file (fgets reads up to the
// next newline character if you don't provide a number of bytes)
while (!feof($file)) {
$line = fgets($file);
// or, since it's a CSV file:
$row = fgetcsv($file);
// $row is not an array with all the CSV columns
// do stuff with the line/row
}
// set the file pointer to 60 kb into the file
fseek($file, 60*1024);
// close the file
fclose($file);
これにより、ファイル全体がメモリに読み込まれることはありません。 Laravelがファイルを処理する独自の方法を持っているかどうかはわかりませんが、これが基本的なPHPでそれを行う方法です。