sql >> Databáze >  >> RDS >> Mysql

jak zvládnout velkou velikost aktualizačního dotazu v mysql pomocí laravel

Pokud uvažujete o vytvoření dotazu jako UPDATE users SET column = 'value' WHERE id = 1 OR id = 2 OR id = 3 ... OR id = 50000 nebo WHERE id IN (1, 2, 3, ..., 50000) pak to bude asi moc velké. Pokud to můžete shrnout do nějaké logiky, zkrátilo by to dotaz a výrazně urychlilo věci na konci MySQL. Možná byste to mohli udělat WHERE id >= 1 AND id <= 50000 .

Pokud to není možné, můžete to udělat v dávkách. Pravděpodobně budete procházet řádky souboru CSV a vytvořit dotaz jako velký WHERE id = 1 OR id = 2... dotaz a každých zhruba 100 řádků (nebo 50, pokud je to stále příliš velké), spusťte dotaz a začněte nový pro dalších 50 ID.

Nebo můžete spustit 50 000 jednotlivých UPDATE dotazy ve vaší databázi. Upřímně řečeno, pokud tabulka správně využívá indexy, spuštění 50 000 dotazů by na většině moderních webových serverů mělo trvat jen několik sekund. I ty nejvytíženější servery by to měly zvládnout za méně než minutu.

Pokud jde o čtení souboru po částech, můžete k tomu použít základní funkce PHP pro přístup k souborům:

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

Tím se nenačte celý soubor do paměti. Nejsem si jistý, jestli má Laravel svůj vlastní způsob zacházení se soubory, ale v základním PHP se to dělá takto.



  1. PDO výstup utf8 vložit

  2. Získání popisovače pro nativní Oracle Connection v Hibernate 4 pro spuštění uloženého proc

  3. SQL Server PIVOT možná?

  4. Jak můžeme přejmenovat název databáze v MySQL 5.0