Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie behandelt man eine große Update-Abfrage in MySQL mit Laravel?

Wenn Sie daran denken, eine Abfrage wie UPDATE users SET column = 'value' WHERE id = 1 OR id = 2 OR id = 3 ... OR id = 50000 zu erstellen oder WHERE id IN (1, 2, 3, ..., 50000) dann wird das wohl zu groß. Wenn Sie dies logisch zusammenfassen können, würde dies die Abfrage verkürzen und die Dinge auf MySQL-Seite erheblich beschleunigen. Vielleicht könnten Sie es WHERE id >= 1 AND id <= 50000 machen .

Wenn das keine Option ist, können Sie es in Schüben tun. Sie werden wahrscheinlich die Zeilen der CSV-Datei durchlaufen und die Abfrage als großen WHERE id = 1 OR id = 2... erstellen Abfrage und alle 100 Zeilen oder so (oder 50, wenn das immer noch zu groß ist), führen Sie die Abfrage aus und starten Sie eine neue für die nächsten 50 IDs.

Oder Sie könnten einfach 50.000 einzelne UPDATE ausführen Abfragen in Ihrer Datenbank. Ehrlich gesagt, wenn die Tabelle Indizes richtig nutzt, sollte das Ausführen von 50.000 Abfragen auf den meisten modernen Webservern nur wenige Sekunden dauern. Selbst die am stärksten ausgelasteten Server sollten das in weniger als einer Minute bewältigen können.

Um eine Datei in Blöcken zu lesen, können Sie dafür die grundlegenden Dateizugriffsfunktionen von PHP verwenden:

$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);

Dadurch wird nicht die vollständige Datei in den Speicher eingelesen. Ich bin mir nicht sicher, ob Laravel seine eigene Art hat, mit Dateien umzugehen, aber so geht das in grundlegendem PHP.