如何优化Laravel的超大数据导入过程?

时间:2019-06-05 10:56:01

标签: laravel laravel-5.7 php-7.1 laravel-5.8

我具有导入大约500万条大量记录的功能。

在导入过程中,我还必须同时为相关表创建条目。

我必须对新条目进行束插入查询,并处理所有查询,并分块进行处理。

还有哪些其他方法可以加快这一过程?

3 个答案:

答案 0 :(得分:3)

(从laracasts复制) 这可能也会有所帮助:

DB::connection()->disableQueryLog();

“默认情况下,Laravel将为当前请求运行的所有查询保留在日志中。但是,在某些情况下,例如插入大量行时,这可能导致应用程序使用过多的内存。”

答案 1 :(得分:1)

对于那些不想单独浏览所有评论的人来说,请总结一下:

  • 使用Laravel为improved performance提供的数据库外观代替口才好的模型。
  • 批量运行导入过程,而不是一次导入所有数据。
  • Disble query logging以节省内存使用量。
  • 在后台作业中而不是在Web请求期间运行导入。

除了已经提出的要点之外,您还可以考虑:

  • 首先运行一个作业,该作业以50行(或其他一些合理的数字)为单位读取输入的xlsx / csv文件。确保没有将所有行都保留在内存中。然后为每行生产一个新作业。因此,您将分两步进行导入。
  • 为每个批次创建单独的作业时,可以同时运行这些作业(=多个队列工作器)。
  • 如果您有用户在等待导入完成,请确保显示进度条或至少显示某种动画加载程序。尽管这并不能加快处理过程,但会提示他们正在完成工作。
  • 您还可以利用database transactions一次运行多个数据库查询(此查询的信用额为Philippe Thiers

答案 2 :(得分:0)

使用:

块中的过程数据 使用Laravel队列

使用https://docs.laravel-excel.com/3.1/imports/ 用户模型绑定示例

namespace App\Imports;

use App\User;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\Importable;

class UsersImport implements ToModel
{
    use Importable;

  public function model(array $row)
  {
      return new User([
       'name'     => $row[0],
       'email'    => $row[1],
       'password' => Hash::make($row[2]),
    ]);
  }
}

在控制器中

(new UsersImport)->import('users.xlsx', 'local', \Maatwebsite\Excel\Excel::XLSX);