加速 Eloquent 查询

Posted

技术标签:

【中文标题】加速 Eloquent 查询【英文标题】:Speed up Eloquent query 【发布时间】:2019-10-11 22:53:17 【问题描述】:

我正在尝试查询大量数据(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));

【问题讨论】:

您的表是否设置了索引和外键?我最近遇到了类似的问题,然后发现我的表中缺少索引,因此请求需要很长时间。 我有索引和外键。 你能避免使用 Eloquent 并使用查询构建器实现 unique() 和 diff() 吗? 【参考方案1】:

只需使用查询构建器

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

原因如下:

查询生成器比 Eloquent 快

比较(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();

然后用于使用集合(简单的方法):

$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 中的操作通常更快。

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

【讨论】:

我无法使用此运行 $journal->outputs(它会引发错误)。如果我尝试通过在输出表上搜索 journal_id 作为原始 SQL 查询来运行它,则需要很长时间。转储集合很快,我相信它在集合上的独特 / diff 方法正在减慢它。 是的,对不起,我错过了,Eloquent 只有 Eloquent Collection,我现在将编辑它;)

以上是关于加速 Eloquent 查询的主要内容,如果未能解决你的问题,请参考以下文章

Eloquent:我需要做这个原始查询吗?

根据另一个 eloquent 查询的结果在循环中运行 eloquent 并在刀片中显示列表

SQL 查询到 Eloquent 的转换

Eloquent 进行长查询

Laravel Eloquent Where , orWhere 和 Find 在同一个 eloquent 查询中的问题

Laravel / Eloquent - 无法执行原始查询