Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Laravel - Chèn hàng loạt trên tập dữ liệu lớn cập nhật khóa trùng lặp

Tôi có một giải pháp - Nó không thanh lịch, nhưng rất nhanh. 1,6 giây cho 80 nghìn bản ghi. Bất kỳ giải pháp nào tốt hơn sẽ được đánh giá cao hơn nhiều.

$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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. tự động tăng dần với một chuỗi số và chữ cái

  2. Nhập CSV hoặc XML vào MySQL

  3. Cách tốt nhất để Chèn dữ liệu JSON vào MYSQL

  4. PreparedStatement ném lỗi cú pháp

  5. Sử dụng các ứng dụng khách MySQL