亲爱的
实际上,我想知道在LARAVEL / MYSQL中处理BIG DATA的最佳解决方案。
在我的系统中,我每天将excel文件(5K行)上传到数据库中,以防万一我在表中找到同一行,所以不插入该行;如果找到同一行,则更改上传的文件日期在我的数据库中。
每次我上传excel时,都要使用下面的普通数组检查表中的每一行(表包含> 50K)是否存在
$res = policies::where('phone', '=', $row['phone'])
->where('draft_no', '=', $row['draftno'])
->where('due_date', '=', $duedate)
->where('status', '=', $stat)
->where('bord_date', '=', $borddate)
->where('amount', '=', $row['amnt'])
->where('remarks', '=', $row['remarks'])
->exists();
if(!$res) {
// insert row ($table->save())
}
else {
//update uploaded date to this row.
}
此过程每次检查表都要花费很多时间。我尝试使用array_chunk进行插入,但是仍然很重(15分钟到20分钟)才能完成
我们非常感谢您的建议。
谢谢
答案 0 :(得分:1)
您可以为每行创建一个哈希,并与该行一起存储。然后仅检查具有给定哈希值的行。
例如,尝试以下代码存根
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
}
}
答案 1 :(得分:0)
如果您不添加相同Excel的新记录,则无需在数据库中检查。但您添加相同的excel文件新记录,然后在更新此excel文件后插入所有记录
答案 2 :(得分:0)
为什么不使用laravel默认的雄辩方法updateOrCreate
。
希望您已经读过它,可以从文档other-creation-methods中阅读。
让我解释一下它的实际作用。
它接受array
的值,并检查数据库中是否已存在该值,如果它已存在于数据库中,它将更新这些值并更新列updated_at
,或者如果它不在数据库中,它将在表中创建一个新条目。
请参见下面的示例:-
policies::updateOrCreate(['value'=>1,'value'=>2,'so on...']);
并且不要忘记添加protected $fillable = [your column]
,因为它为此使用$ fillable。