【问题标题】:Faster insert record to database from excel file Laravel 5从 excel 文件 Laravel 5 更快地将记录插入数据库
【发布时间】:2015-12-04 06:42:06
【问题描述】:

我正在制作一个模块,您可以将记录从 excel 文件上传到数据库中。这些只是电话号码。所以这是我的代码:

        $file = Input::file('file');
        Excel::load($file, function($reader) {
            // Getting all results
            $results = $reader->get()->toArray();
            //var_dump($results);exit;
            foreach ($results as $key => $value) {
                $phone = new Phone();
                $phone->msisdn          =  $value['msisdn'];
                $phone->save();
            }
        });

我正在使用https://github.com/Maatwebsite/Laravel-Excel 来读取 excel 文件。它工作正常,我猜 20 分钟内上传了 20,000 条记录,有没有办法让它更快地上传?我知道这也取决于服务器,但还有其他因素吗?我正在使用 MySQL

谢谢

【问题讨论】:

  • 20000 是 20 分钟似乎很慢。你能记录下每个操作需要多长时间才能看到瓶颈在哪里?
  • 能否不将 Excel 文件的(相关位)保存为 CSV,然后使用LOAD DATA 或 mysqlimport?
  • 这里的主要问题是您正在循环插入。不要使用 Eloquent,而是使用 Query Builder。 Here 是一个帮助你前进的例子。
  • 问题几乎肯定出在 Excel 方面。该软件包使用 PHPExcel,这是一个令人难以置信的软件包,但 非常 资源密集。 This question 询问用于在 PHP 中读取 Excel 文件的不同包。我没有研究过这些,所以我不能代表任何一个。如果您可以将 Excel 文件另存为 CSV,那将为您提供最佳性能
  • 我认为查看批量插入或LOAD DATA FROM INFILE 是您最好的选择。我还认为,如果采用批量插入路线,您可以通过不将全部内容读入内存来节省时间。只需读取文件的每一行并继续构建批量插入查询,当查询达到一次要插入的记录数时触发实际插入。我绝对不会采取额外的步骤来实例化每个插入的电话对象,除非您需要在插入之前执行诸如验证/转换数据之类的操作。

标签: php mysql excel upload laravel-5


【解决方案1】:

当您使用如此大的文件时,可能会从他们的文档中对结果进行分块。这样您就可以读取文件的块而不是将整个文件加载到内存中。

http://www.maatwebsite.nl/laravel-excel/docs/import#chunk

【讨论】:

    【解决方案2】:

    您可以尝试这个更快的替代方案 (https://github.com/rap2hpoutre/fast-excel):

    (new FastExcel)->import($file, function ($line) {
        $phone = new Phone();
        $phone->msisdn = $value['msisdn'];
        $phone->save();
    });
    

    【讨论】:

      猜你喜欢
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多