Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

como lidar com tamanho grande de consulta de atualização no mysql com laravel


Se você está pensando em construir uma consulta como UPDATE users SET column = 'value' WHERE id = 1 OR id = 2 OR id = 3 ... OR id = 50000 ou WHERE id IN (1, 2, 3, ..., 50000) então isso provavelmente será muito grande. Se você puder fazer alguma lógica para resumir isso, encurtaria a consulta e aceleraria significativamente as coisas no final do MySQL. Talvez você possa fazer WHERE id >= 1 AND id <= 50000 .

Se isso não for uma opção, você pode fazê-lo em rajadas. Você provavelmente vai percorrer as linhas do arquivo CSV, construir a consulta como um grande WHERE id = 1 OR id = 2... query e a cada 100 linhas ou mais (ou 50 se ainda for muito grande), execute a consulta e inicie uma nova para os próximos 50 IDs.

Ou você pode simplesmente executar 50.000 UPDATE único consultas em seu banco de dados. Honestamente, se a tabela fizer uso adequado de índices, a execução de 50.000 consultas deve levar apenas alguns segundos na maioria dos servidores modernos. Mesmo os servidores mais ocupados devem ser capazes de lidar com isso em menos de um minuto.

Quanto à leitura de um arquivo em pedaços, você pode usar as funções básicas de acesso a arquivos do PHP para isso:
$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);

Isso não lerá o arquivo completo na memória. Não tenho certeza se o Laravel tem sua própria maneira de lidar com arquivos, mas é assim que se faz isso no PHP básico.