PHP/Laravel 查询效率

Posted

技术标签:

【中文标题】PHP/Laravel 查询效率【英文标题】:PHP/Laravel Query Efficiency 【发布时间】:2019-09-13 12:21:45 【问题描述】:

我正在计算篮球统计数据,并有模型 Stat、User(篮球运动员所在的位置)、Team、Stat_Meta、Game、Season、Substitution。

我有一个名为 statTable 的视图,它可以添加到应用程序的任何其他视图中。 statTable 基本上只是遍历团队中的每个球员并检索每个统计类型的计算(在 Stat_Meta 模型中找到)。在这些计算中,有针对 Stat、Game、Season 等表的查询。当它遍历每个玩家及其所有统计数据时,我们每场比赛大约有 500 个查询(通常我们会经历大约 30 个查询/视图,所以你做数学,这很糟糕)。

我的问题:安装 Laravel 调试栏后,我可以看到在我的测试环境中,加载首页时运行了 3116 个查询,其中 2432 个是重复的。加载也需要很长时间。 那么,我怎样才能重新设计这个查询系统来减少它们的数量呢?

完全披露,我不是 CS 人员,所以效率不是我受过的训练。现在,我非常高兴这甚至可以工作,但不会花费我一只手臂和一个大规模执行所有这些查询(更不用说糟糕的用户体验)。

【问题讨论】:

看起来您正在代码中进行计算。最好让数据库服务器进行计算(每组的 SUM/AVG)。 【参考方案1】:

您可以使用 Laravel 的即时加载对查询进行一些优化。官方documentation对Eager loading的定义:

当访问 Eloquent 关系作为属性时,关系 数据是“延迟加载”。这意味着关系数据不是 实际加载,直到您第一次访问该属性。然而,雄辩 可以在查询父模型时“急切加载”关系。 Eager loading 缓解了 N+1 查询问题。

您可以从我提供的链接中阅读一些很棒的示例。我相信这会大大优化您的查询。

除了急切加载之外,您应该始终致力于尽可能多地完成查询,而不是使用 php、Laravel 集合等处理数据。

【讨论】:

以上是关于PHP/Laravel 查询效率的主要内容,如果未能解决你的问题,请参考以下文章

php Laravel按字符串查询模型

php Laravel条件查询使用When

php Laravel - 捕获SQL查询

php Laravelの查询生成器

php #laravel #php用于排序和搜索/过滤的查询范围

php Laravel限制查询仅限当前月份