Nếu bạn đang nghĩ đến việc tạo một truy vấn như UPDATE users SET column = 'value' WHERE id = 1 OR id = 2 OR id = 3 ... OR id = 50000
hoặc WHERE id IN (1, 2, 3, ..., 50000)
thì điều đó có lẽ sẽ quá lớn. Nếu bạn có thể thực hiện một số logic để tóm tắt điều đó, nó sẽ rút ngắn truy vấn và tăng tốc mọi thứ trên MySQL đáng kể. Có lẽ bạn có thể đặt nó thành WHERE id >= 1 AND id <= 50000
.
Nếu đó không phải là một lựa chọn, bạn có thể thực hiện theo từng đợt. Có thể bạn sẽ lặp qua các hàng của tệp CSV, tạo truy vấn dưới dạng WHERE id = 1 OR id = 2...
lớn và cứ sau 100 hàng (hoặc 50 hàng nếu vẫn quá lớn), hãy chạy truy vấn và bắt đầu một truy vấn mới cho 50 ID tiếp theo.
Hoặc bạn chỉ có thể chạy 50.000 đơn UPDATE
truy vấn trên cơ sở dữ liệu của bạn. Thành thật mà nói, nếu bảng sử dụng hợp lý các chỉ mục, việc chạy 50.000 truy vấn sẽ chỉ mất vài giây trên hầu hết các máy chủ web hiện đại. Ngay cả những máy chủ bận rộn nhất cũng có thể xử lý việc đó trong vòng chưa đầy một phút.
Đối với việc đọc một tệp tin theo khối, bạn có thể sử dụng các hàm truy cập tệp cơ bản của PHP để làm việc đó:
$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);
Điều này sẽ không đọc toàn bộ tệp vào bộ nhớ. Không chắc liệu Laravel có cách xử lý tệp riêng của mình hay không, nhưng đây là cách thực hiện điều đó trong PHP cơ bản.