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

Viv*_*nki 8 laravel php-7.1 laravel-5.7 laravel-5.8

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

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

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

还有什么其他方法可以加快这一过程?

Ptr*_*Ton 5

因此,为那些懒得单独查看所有评论的人总结一下:

  • 使用 Laravel 提供的数据库外观而不是 Eloquent 模型来提高性能
  • 批量运行导入过程,而不是一次导入所有数据。
  • 禁用查询日志记录以节省内存使用。
  • 在后台作业中运行导入,而不是在 Web 请求期间运行。

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

  • 首先运行一个作业,以 50 行(或其他合理的数字)为一组读取输入 xlsx/csv 文件。确保没有将所有行都保留在内存中。然后为每批生产线创建一个新作业。因此,您将进行两步导入。
  • 为每个批次创建单独的作业时,您可以同时运行这些作业(= 同时运行多个队列工作人员)。
  • 如果您有用户等待导入完成,请确保显示进度条或至少显示某种动画加载程序。虽然这不会加快进程,但会给他们一个指示工作正在完成。
  • 您还可以利用数据库事务来同时运行多个数据库查询(这一点归功于Philippe Thiers )


man*_*anu 4

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

DB::connection()->disableQueryLog();
Run Code Online (Sandbox Code Playgroud)

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