Php Laravel/Mysql-处理大型数据

Php Laravel/Mysql-处理大型数据,php,laravel,Php,Laravel,亲爱的 实际上,我想知道在LARAVEL/MYSQL中操纵大数据的最佳解决方案 在我的系统中,我正在将每日excel文件(5K行)上载到我的数据库中,以防我在表中找到相同的行,因此我不会插入它,如果我找到相同的行,我会更改数据库中的上载日期 每次我上传excel时,我都会用一个普通数组检查表中的每一行(表包含>50K),如下所示 $res=policies::where('phone','=',$row['phone'])) ->其中('draft_no','=',$row['draftno']

亲爱的

实际上,我想知道在LARAVEL/MYSQL中操纵大数据的最佳解决方案

在我的系统中,我正在将每日excel文件(5K行)上载到我的数据库中,以防我在表中找到相同的行,因此我不会插入它,如果我找到相同的行,我会更改数据库中的上载日期

每次我上传excel时,我都会用一个普通数组检查表中的每一行(表包含>50K),如下所示

$res=policies::where('phone','=',$row['phone']))
->其中('draft_no','=',$row['draftno']))
->其中('due_date','=',$duedate)
->其中('status','=',$stat)
->其中('bord_date','=',$borddate)
->其中('amount','=',$row['amnt']))
->其中('备注','=',$row['备注']))
->存在();
如果(!$res){
//插入行($table->save())
}
否则{
//将上载日期更新到此行。
}
每次bcz检查表时,此过程都会花费大量时间。我尝试使用array_chunk来插入,但仍然需要很大的负载(15分钟到20分钟)

非常感谢你的建议


谢谢

您可以为每一行创建一个散列,并与该行一起存储。然后只检查具有给定哈希的行

例如,试试这个代码存根

foreach ($rows as $row) {
    $hash = md5($row['phone'] . $row['draft_no'] . $row['due_date'] ...);
    $res = Policiess::where('hash', $hash);
    if (!$res) {
         // create a new row and store the `$hash` in `hash` column
    } else {
         //update uploaded date to this row
    }
}

若并没有添加新记录,那个么就不需要签入数据库。但是您可以添加相同的excel文件新记录,然后在更新此excel文件后插入所有记录

为什么不使用laravel默认雄辩方法
updateOrCreate
。 希望你已经读过了,如果你没有,你可以从文档中阅读

让我解释一下它的实际作用

它接受值的
数组
,并检查值是否已存在于数据库中。如果值已存在于数据库中,它将更新这些值,并更新列
updated_at
,如果值不存在于数据库中,它将在表中创建一个新条目

见下文:-

policies::updateOrCreate(['value'=>1,'value'=>2,'so on...']);

不要忘记添加
protected$filleble=[您的列]
,因为这是使用$filleble来实现的。

也许在某个地方存储散列(正如莱昂纳多所建议的)是一种解决方法。也许在插入触发器之前,Redis将是一个选项。工作得很有魅力!!感谢您提供了这个漂亮的解决方案。出于好奇,使用这种方法处理整个文件需要多长时间?大约需要13分钟,现在需要2.5分钟:)尝试在该coulmn上添加索引,它应该会加快速度: