sql >> Database >  >> RDS >> Mysql

hoe om te gaan met een grote updatequery in mysql met laravel

Als u overweegt een query te maken zoals UPDATE users SET column = 'value' WHERE id = 1 OR id = 2 OR id = 3 ... OR id = 50000 of WHERE id IN (1, 2, 3, ..., 50000) dan is dat waarschijnlijk te groot. Als je wat logica kunt bedenken om dat samen te vatten, zou het de query verkorten en de zaken aan het einde van MySQL aanzienlijk versnellen. Misschien kun je er WHERE id >= 1 AND id <= 50000 van maken .

Als dat geen optie is, zou je het in bursts kunnen doen. Je gaat waarschijnlijk door de rijen van het CSV-bestand lopen, de query opbouwen als een grote WHERE id = 1 OR id = 2... query en elke 100 rijen of zo (of 50 als dat nog steeds te groot is), voer je de query uit en start je een nieuwe voor de volgende 50 ID's.

Of u kunt gewoon 50.000 enkele UPDATE uitvoeren query's op uw database. Eerlijk gezegd, als de tabel goed gebruik maakt van indexen, zou het uitvoeren van 50.000 zoekopdrachten op de meeste moderne webservers slechts een paar seconden duren. Zelfs de drukste servers zouden dat in minder dan een minuut moeten kunnen verwerken.

Wat betreft het lezen van een bestand in stukjes, je kunt daarvoor de basisfuncties voor bestandstoegang van PHP gebruiken:

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

Hierdoor wordt niet het volledige bestand in het geheugen ingelezen. Ik weet niet zeker of Laravel zijn eigen manier heeft om met bestanden om te gaan, maar dit is hoe je dat doet in basis PHP.



  1. CASE-instructie gebruiken in MySQL

  2. Ingewikkelde SQL-query - items vinden die overeenkomen met meerdere verschillende externe sleutels

  3. Laravel:Opgegeven sleutel was te lang; maximale sleutellengte is 767 bytes

  4. Hoe kan ik de proceslijst weergeven als er meer dan n vragen zijn?