首页 > 解决方案 > 加速 Eloquent 查询

问题描述

我正在尝试查询大量数据(40K 记录),并计划在未来查询更大的数据集。Eloquent 似乎需要很长时间才能加载这些数据。我想知道是否有更快的方法来处理这些数据。我正在尝试查看我的数据的有效性,因此检查是否所有字段都为空。

我使用了常规的 Eloquent 调用。我不认为分块数据是合适的,因为我不打算以任何方式修改数据。我争论过是否经常运行一项工作并调用这项工作的结果可能是一种更好的方法。

$journal = Journal::where('issn', $this->issn)->first();
$collection = $journal->outputs;
$collectionUnique = $collection->unique('doi');
$collectionDupes = $collection->diff($collectionUnique);

dd('Total Articles '.$this->getTotal(), 'Total Articles '.count($collection));

标签: laravelperformanceeloquent

解决方案


只需使用查询生成器

为什么我们应该使用查询构建器而不是 Eloquent 来处理大量记录?!

这是原因:

Query Builder比 Eloquent快得多:

比较(雄辩与查询生成器):

为一个简单的表插入 1000 行 Eloquent 需要 1.2 秒,在这种情况下,数据库外观只需要 800 毫秒(毫秒)。

另一个比较:

Eloquent ORM 平均响应时间

Joins | Average (ms) 
------+-------------
1     | 162,2 
3     | 1002,7 
4     | 1540,0 

Result of select operation average response time for Eloquent ORM

原始 SQL 平均响应时间

 Joins | Average (ms) 
------+-------------
1     | 116,4 
3     | 130,6 
4     | 155,2 

Result of select operation average response time for Raw SQL

更多信息:Laravel Eloquent vs Query Builder


编辑:

您的代码应该是:

$journal = DB::table('journals')->where('issn', $this->issn)->first();


然后使用 Collection (简单的方法):

$journal = Collection::make($journal); //For use Collection Methods
$collection = $journal->get("outputs");//Changed
$collectionUnique = $collection->unique('doi');
$collectionDupes = $collection->diff($collectionUnique);

dd('Total Articles '.$this->getTotal(), 'Total Articles '.count($collection));

最棒的表演 :

使用查询和查询生成器而不是集合。因为 SQL 中的操作通常更快。

请比较您上一个代码和此代码的时间,请在评论中告诉我:)


推荐阅读