从 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 文件导入导出功能(转)