sql >> Databasteknik >  >> RDS >> Mysql

hur man hanterar stora uppdateringsfrågor i mysql med laravel

Om du funderar på att bygga en fråga som UPDATE users SET column = 'value' WHERE id = 1 OR id = 2 OR id = 3 ... OR id = 50000 eller WHERE id IN (1, 2, 3, ..., 50000) då blir det nog för stort. Om du kan göra lite logik för att sammanfatta det, skulle det förkorta frågan och påskynda saker och ting i MySQL:s ände avsevärt. Kanske kan du göra det WHERE id >= 1 AND id <= 50000 .

Om det inte är ett alternativ kan du göra det i skurar. Du kommer förmodligen att gå igenom raderna i CSV-filen, bygga frågan som en stor WHERE id = 1 OR id = 2... fråga och var 100:e rad eller så (eller 50 om det fortfarande är för stort), kör frågan och starta en ny för de kommande 50 ID:n.

Eller så kan du bara köra 50 000 enstaka UPDATE frågor i din databas. Ärligt talat, om tabellen använder index på rätt sätt, bör körning av 50 000 frågor bara ta några sekunder på de flesta moderna webbservrar. Även de mest trafikerade servrarna borde kunna hantera det på under en minut.

När det gäller att läsa en fil i bitar, kan du använda PHP:s grundläggande filåtkomstfunktioner för det:

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

Detta kommer inte att läsa hela filen i minnet. Inte säker på om Laravel har sitt eget sätt att hantera filer, men så här gör du det i grundläggande PHP.



  1. SQL parser i PHP?

  2. Välj från mysql in i variabeln VB.NET

  3. Hibernate:constraintName är null i MySQL

  4. Hur testar man om en sträng är JSON eller inte?