【问题标题】:Laravel reduce loading time of 50k rows belongTo count queryLaravel 减少 50k 行的加载时间
【发布时间】:2020-11-10 16:24:45
【问题描述】:

我得到以下查询大约需要 4 秒,但我不知道如何优化它,也许有人可以帮忙。

Model::all()->where('belongsToClass.active', 1)->count();

加载时间长来自 where belongsToClass 检查。没有它,计数是即时的。 数据大小:Model 50k 行数据; belongsToClass 400行数据

服务器不可能是问题,我在 model/belongsto 表上使用了外键/索引。

【问题讨论】:

  • 这个视频对你们有很大帮助。这里很难解释。-> watch this video
  • 感谢您的视频,它有助于更​​好地理解问题。
  • 50K 将会增长,根据您使用计数的目的,您可以选择缓存计数,尤其是用于显示目的时。
  • 请提供生成的SQL。以及表上存在哪些索引。

标签: php mysql laravel optimization


【解决方案1】:

Model::all() 将检索该模型的所有记录(在集合中),之后您使用遍历整个集合的->where()。而是在模型本身上使用->whereHas

Model::whereHas('belongsToClass', function($query) {
    $query->where('active', 1)
})->count();

请务必阅读文档,https://laravel.com/docs/7.x/eloquent-relationships#querying-relationship-existence

他们解释得比我好。

【讨论】:

  • 我明白你的意思,我使用的是你在其他情况下编写的方式,但这里的连接缺失/“belongsToClass.active”在这种情况下不起作用。解决方案是什么?我尝试了以下方法,但跳过了 with: Model::with('belongsToClass')->where('belongsToClass.active', 1)->count();结果是: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'belongsToClass.active' in 'where clause' (SQL: select count(*) as aggregate from Model where belongsToClass.active = 1 )
  • 如果是关系中的值,则需要使用 whereIn
  • whereIn 似乎不在这里。我让它以这种方式工作,但我希望它与“with”一起工作,因为它是一个 belongsTo 模型,我不想像那样使用连接。 "Model::leftJoin('belongsToClass', 'model.id', '=', 'belongsToClass.id')->where('belongsToClass.active', 1)->count());"
  • @DappFuture 我没明白,我调整了答案
猜你喜欢
  • 2017-12-30
  • 2011-05-27
  • 2014-05-30
  • 1970-01-01
  • 2020-11-07
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多