Laravel / Mysql-处理大数据

时间:2019-05-30 06:58:45

标签: php laravel

亲爱的

实际上,我想知道在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分钟)才能完成

我们非常感谢您的建议。

谢谢

3 个答案:

答案 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。