sql >> Databasteknik >  >> RDS >> Mysql

Laravel - Bulk infoga på dubblettnyckel uppdatera stor datamängd

Jag har en lösning – den är inte elegant, men väldigt snabb. 1,6s för 80 000 poster. Bättre lösningar skulle uppskattas mycket.

$allResults = [
    ['id' => 1, 'rank' => 100],
    ['id' => 2, 'rank' => 99],
    ['id' => 3, 'rank' => 102],
    ...
    ['id' => 80000, 'rank' => 3],
];

$rankings = [];
foreach ($allResults as $result) {
    $rankings[] = implode(', ', ['"' . $result['id'] . '"', $result['rank']]);
}

$rankings = Collection::make($rankings);

$rankings->chunk(500)->each(function($ch) {
    $rankingString = '';
    foreach ($ch as $ranking) {
        $rankingString .= '(' . $ranking . '), ';
    }

    $rankingString = rtrim($rankingString, ", ");

    try {
        \DB::insert("INSERT INTO my_rankings (`id`, `rank`) VALUES $rankingString ON DUPLICATE KEY UPDATE `rank`=VALUES(`rank`)");
    } catch (\Exception $e) {
        print_r([$e->getMessage()]);
    }
});


  1. Vad är en databas? Och en DBMS?

  2. Varför är CTE bättre än markör/deriverad tabell/ subqueries/temp tabell etc.?

  3. Hur returnerar man fälttyp från MySQL-fråga?

  4. MySQL-lutning (trend) för enstaka fält (linje med bästa passform)