网站页面加载缓慢,服务提供者代码是否会引发N+1查询性能问题?
问题结论
这段代码会引发重复查询问题,不属于典型ORM关联场景的N+1查询,但本质和N+1一样属于重复执行SQL导致的性能损耗,是你页面加载缓慢的直接原因。
问题根因
- 你使用了
*通配符注册全局视图合成器,只要当前页面渲染了N个拆分视图(例如布局、侧边栏、内容区块、页脚等独立视图文件),合成器内的所有查询逻辑就会重复执行N次,Clockwork检测到的多余查询完全来源于此。 - print页面场景下你分2次单独查询
General表获取地址和电话信息,额外多产生1次无意义查询。
修复方案
- 解决视图合成器重复执行问题
- 方案一(优先推荐):不要用
*通配符注册全局合成器,仅给需要用到这些公共变量的顶层布局视图注册合成器,避免子视图渲染时重复触发逻辑。 - 方案二:使用Laravel请求级单次缓存功能包裹所有查询逻辑,Laravel 9及以上版本可直接用
once()辅助函数,保证单次请求内同一段查询逻辑只会执行一次,示例如下:// 以logo查询为例 $logo = once(fn () => General::where('type', 'logo')->first()); // 其余订单查询、General表查询都按相同方式用once包裹即可
- 方案一(优先推荐):不要用
- 优化
General表重复查询
print页面的2次单独查询合并为1次批量查询,减少SQL执行次数:$generalData = General::whereIn('type', ['alamat', 'telepon'])->pluck('content', 'type'); $alamat = $generalData['alamat'] ?? ''; $telepon = $generalData['telepon'] ?? ''; - 可选优化:提前计算一次当前URL的判断结果,避免多次重复执行
strpos判断逻辑。
内容的提问来源于stack exchange,提问作者jan_ary
相关产品推荐
相关产品推荐

