【问题标题】:Laravel/Mysql - Manipulate large dataLaravel/Mysql - 处理大数据
【发布时间】:2019-10-15 19:32:48
【问题描述】:

亲爱的,

实际上,我想知道在 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.
                    }

此过程需要大量时间 bcz 每次检查表。我尝试使用 array_chunk 来插入,但是负载仍然很大(15 分钟到 20 分钟)才能完成

非常感谢您的建议。

谢谢

【问题讨论】:

  • 可能在某处存储散列(如莱昂纳多建议的那样)是一种出路。也许 Redis 将是一个选择
  • 也许在插入触发器之前会做一些工作。

标签: php laravel


【解决方案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
    }
}

【讨论】:

  • 像魅力一样工作!感谢您提供这个漂亮的解决方案。
  • 只是出于好奇,用这种方法处理整个文件需要多长时间?
  • 之前大约需要 13 分钟,现在需要 2.5 分钟 :)
  • 尝试在该列上添加索引,它应该会加快速度:stackoverflow.com/a/3002635/562097
【解决方案2】:

如果您不添加新记录相同的 excel,则不需要签入数据库。但是您添加相同的 excel 文件新记录,然后在更新此 excel 文件后插入所有记录

【讨论】:

    【解决方案3】:

    为什么不用 laravel 默认的 eloquent 方法updateOrCreate。 希望您已经阅读过它,如果您不阅读,可以从文档other-creation-methods 中阅读。

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

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

    参见下面的例子:-

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

    不要忘记添加 protected $fillable = [your column] ,因为它为此使用了 $fillable。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-09
      • 2021-08-02
      • 1970-01-01
      • 2013-05-17
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      相关资源
      最近更新 更多