gpt4 book ai didi

php - Laravel - 重复键批量插入更新大数据集

转载 作者:行者123 更新时间:2023-12-02 16:54:53 24 4
gpt4 key购买 nike

我有大约 80k 条记录,每天需要运行多次插入/更新脚本。

INSERT INTO `my_rankings` (`id`, `rank`) VALUES (1,100),(2,99)(3,102)...(80000,3) 
ON DUPLICATE KEY UPDATE `rank` = values(`rank`);

这些记录当前采用数组格式:

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

有没有一种好的/高性能的方法可以运行上述更新查询?

我查看了 Eloquent 的 Model::updateOrCreate(...)。但是我不认为我可以使用它来批量插入/更新。

我想避免在 $rankings 数组上使用 foreach 并插入/更新单个记录,因为该脚本将花费太长的时间。

我在下面有这个问题的答案https://stackoverflow.com/a/34815725/1239122 ,但它远非优雅。

最佳答案

我有一个解决方案 - 它并不优雅,但非常快。 80k 条记录需要 1.6 秒。任何更好的解决方案将不胜感激。

$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()]);
}
});

关于php - Laravel - 重复键批量插入更新大数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34813284/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com