第一个问题,请指出是否可以澄清。 我已经使用过StackOverflow答案很多次了,所以谢谢您的帮助!
我正在开发的网站需要从CSV文件导入许多条目。 数据和保存的转换目前可以正常进行,但是由于一个文件中可以包含数千个条目,因此将数据导入数据库可能非常长。
将大型条目数组(包含每个条目的数据的数组)保存到DB的最佳方法是什么?
这是我目前正在使用的代码:
for ($i = 0; $i < count($participants); $i ++)
{
Participant::firstOrCreate( [ 'survey_id' => $participants[$i]['survey_id'],
'id_importe' => $participants[$i]['id_importe'] ],
array_merge( $participants[$i], ['token' => $savedInLime[$i]['token']] ) );
}
我将数组的构造保留在其中,但是重要的部分是:有没有比在数组中循环并对每个条目“ firstOrCreating”更好的方法了?
编辑
我对每个包含大约3900个条目的文件使用计时器测试了这些方法。
TLDR:由于存在双循环,“ create”仅比“ firstOrCreate”和“ insert”要慢得多。
1-我将之前的代码用于firstOrCreate,耗时216s
2-我将此代码用于“创建”,并且速度稍快(205秒),但不能确保该条目不是副本
for ($i = 0; $i < count($participants); $i ++)
{
Participant::create(
'id_importe' => $participants[$i]['id_importe'] ],
array_merge( $participants[$i], ['token' => $savedInLime[$i]['token']] ) );
}
3-我将这段代码用于插入(也许可以使用数组函数更快地完成),并且花了460 s。 由于数据库占位符限制(我认为略高于60k),我不得不使用array_chunk。
$tmp = array();
for ($i = 0; $i < count($participants); $i ++){
$tmp[] = array_merge( $participants[$i], ['token' => $savedInLime[$i]['token']] );
}
$inserts = array_chunk($tmp, 2000);
foreach ($inserts as $insert){
Participant::insert($insert);
}
答案 0 :(得分:0)
尝试一下:
$participants = [
['participant_id' => 11, 'survey_id' => 1),
['participant_id' => 22, 'survey_id' => 2),
];
Participant::insert($participants);
但它不会涉及时间戳IIRC。
答案 1 :(得分:0)
对于任何新手来说都不懂的人:
我最终保留了循环+ firstOrCreate技术,因为相比于可靠性获得的时间损失很小。