sql >> Base de Datos >  >> RDS >> Mysql

cómo manejar un tamaño grande de consulta de actualización en mysql con laravel

Si está pensando en crear una consulta como 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) entonces eso probablemente será demasiado grande. Si puede hacer algo de lógica para resumir eso, acortaría la consulta y aceleraría significativamente las cosas en el extremo de MySQL. Tal vez podrías hacerlo WHERE id >= 1 AND id <= 50000 .

Si esa no es una opción, podría hacerlo en ráfagas. Probablemente va a recorrer las filas del archivo CSV, construir la consulta como un gran WHERE id = 1 OR id = 2... consulta y cada 100 filas más o menos (o 50 si todavía es demasiado grande), ejecute la consulta y comience una nueva para las siguientes 50 ID.

O simplemente podría ejecutar 50.000 UPDATE individuales consultas en su base de datos. Honestamente, si la tabla hace un uso adecuado de los índices, ejecutar 50.000 consultas solo debería tomar unos segundos en la mayoría de los servidores web modernos. Incluso los servidores más ocupados deberían poder manejar eso en menos de un minuto.

En cuanto a la lectura de un archivo en fragmentos, puede usar las funciones básicas de acceso a archivos de PHP para eso:

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

Esto no leerá el archivo completo en la memoria. No estoy seguro de si Laravel tiene su propia forma de manejar archivos, pero así es como se hace en PHP básico.