Mysql
 sql >> Database >  >> RDS >> Mysql

come gestire query di aggiornamento di grandi dimensioni in mysql con laravel

Se stai pensando di creare una query come UPDATE users SET column = 'value' WHERE id = 1 OR id = 2 OR id = 3 ... OR id = 50000 o WHERE id IN (1, 2, 3, ..., 50000) allora sarà probabilmente troppo grande. Se riesci a fare un po' di logica per riassumerlo, ridurrebbe la query e accelererebbe significativamente le cose da parte di MySQL. Forse potresti farlo WHERE id >= 1 AND id <= 50000 .

Se questa non è un'opzione, potresti farlo a raffica. Probabilmente scorrerai le righe del file CSV, costruirai la query come un grande WHERE id = 1 OR id = 2... query e ogni 100 righe circa (o 50 se è ancora troppo grande), esegui la query e avviane una nuova per i successivi 50 ID.

Oppure potresti semplicemente eseguire 50.000 UPDATE singoli query sul tuo database. Onestamente, se la tabella fa un uso corretto degli indici, l'esecuzione di 50.000 query dovrebbe richiedere solo pochi secondi sulla maggior parte dei server web moderni. Anche i server più impegnati dovrebbero essere in grado di gestirlo in meno di un minuto.

Per quanto riguarda la lettura di un file in blocchi, puoi utilizzare le funzioni di accesso ai file di base di PHP per questo:

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

Questo non leggerà l'intero file in memoria. Non sono sicuro che Laravel abbia il suo modo di gestire i file, ma ecco come farlo in PHP di base.