从 excel 文件 Laravel 5 更快地将记录插入数据库

Posted

技术标签:

【中文标题】从 excel 文件 Laravel 5 更快地将记录插入数据库【英文标题】:Faster insert record to database from excel file 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 是您最好的选择。我还认为,如果采用批量插入路线,您可以通过不将全部内容读入内存来节省时间。只需读取文件的每一行并继续构建批量插入查询,当查询达到一次要插入的记录数时触发实际插入。我绝对不会采取额外的步骤来实例化每个插入的电话对象,除非您需要在插入之前执行诸如验证/转换数据之类的操作。 【参考方案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();
);

【讨论】:

以上是关于从 excel 文件 Laravel 5 更快地将记录插入数据库的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 5 中使用 Laravel Excel 实现 Excel/CSV 文件导入导出功能

在 Laravel 5 中使用 Laravel Excel 实现 Excel/CSV 文件导入导出功能(转)

如何更快地将 WordPress 网站从子域移动到主域

Laravel 5 - 从文件扩展名中获取 MIME 类型

Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解

读取excel文件并上传到数据库Laravel 5