【问题标题】:Laravel: MASSIVE updateOrCreate()Laravel:大规模更新或创建()
【发布时间】:2018-01-01 00:17:39
【问题描述】:

我正在尝试将数据(每晚)从一个古老的系统中导出到更容易编写代码的东西中;但是,导出的数据量非常大。

我将数据转储为 JSON 对象,然后尝试使用 Laravel updateOrCreate(),但我的数据太多了。将所有数据处理成 250 万 个 MySQL 行通常需要大约 10 个小时。

我认为它很慢,因为它实际上执行了 500 万次查询。

有谁知道使用 Laravel 如何有效地执行 MASSIVE updateOrCreate() 的任何好例子?

【问题讨论】:

  • 您可能想要在 Eloquent 之外执行此操作。
  • ORM 在处理大量数据方面并不是特别出色。为此使用普通的旧 sql。 Insert ... select ... 用于插入,多表更新用于更新。
  • 您可能希望至少对数据进行分块,以避免在处理之前将这些数据占用您的内存。试试这个方法怎么样:stackoverflow.com/a/44891984/5704410

标签: php mysql laravel laravel-5 laravel-5.4


【解决方案1】:

可能很大程度上取决于确切的数据,但我会尝试使用数据包。因此,您首先以 JSON 中的 500 条数据记录为例,然后手动运行 500 条查询以验证数据是否存在。

对于那些存在的,您为它们中的每一个运行更新,但对于那些不存在的,您不会立即将它们插入,而是将它们放入数组中,然后像这样批量插入它们:

DB::table('your_table')->insert($records);

您应该确保您的记录没有太多或太少,以尽可能加快处理速度。

一般来说,批量插入可以大大加快您的操作,但一切都取决于您拥有的数据以及放置这些数据的确切算法。

【讨论】:

  • 我喜欢这种方法。它肯定会加快速度,但恐怕不会太多,因为我很确定 95% 的数据只是更新(如果它甚至需要更新,因为它正在被转储,无论它是否已更改) )
  • 更新前是否检查数据是否实际发生了变化?选择查询比更新便宜得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-13
  • 2014-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多