Jeśli myślisz o zbudowaniu zapytania, takiego jak UPDATE users SET column = 'value' WHERE id = 1 OR id = 2 OR id = 3 ... OR id = 50000
lub WHERE id IN (1, 2, 3, ..., 50000)
wtedy prawdopodobnie będzie za duży. Jeśli potrafisz stworzyć jakąś logikę, aby to podsumować, skróciłoby to zapytanie i znacznie przyspieszyło działanie MySQL. Może mógłbyś zrobić to WHERE id >= 1 AND id <= 50000
.
Jeśli nie masz takiej możliwości, możesz to zrobić seriami. Prawdopodobnie przejdziesz przez wiersze pliku CSV, zbudujesz zapytanie jako duże WHERE id = 1 OR id = 2...
zapytanie i co około 100 wierszy (lub 50, jeśli to wciąż za dużo), uruchom zapytanie i rozpocznij nowe dla kolejnych 50 identyfikatorów.
Możesz też po prostu uruchomić 50 000 pojedynczych UPDATE
zapytania w Twojej bazie danych. Szczerze mówiąc, jeśli tabela właściwie wykorzystuje indeksy, uruchomienie 50 000 zapytań na większości nowoczesnych serwerów WWW powinno zająć tylko kilka sekund. Nawet najbardziej obciążone serwery powinny poradzić sobie z tym w niecałą minutę.
Jeśli chodzi o odczytywanie pliku porcjami, możesz użyć do tego podstawowych funkcji dostępu do plików 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);
To nie spowoduje wczytania całego pliku do pamięci. Nie jestem pewien, czy Laravel ma swój własny sposób radzenia sobie z plikami, ale tak to zrobić w podstawowym PHP.