总结要点:使用 Laravel 开发工具,ORM 查询的 N + 1 问题
Laravel 开发者工具
-
laravel-debugbar
-
安装
composer require "barryvdh/laravel-debugbar:~3.1" --dev
-
生成配置文件
config/debugbar.php
php artisan vendor:publish --provider="Barryvdh\Debugbar\ServiceProvider"
-
配置启用条件
// config/debugbar.php 'enabled' => env('APP_DEBUG', false),
数据库查询的 N + 1 问题
N + 1 问题在 ORM 中普遍存在,常见于遍历操作中
N + 1 怎么来
假设需要现在需要查找模型 A 的 n 条数据,而模型 A 又关联了另外多个的模型,这里假设 A 关联了模型 B 和 C. 现在需要查找 n 条 A 的记录(这里需要
1
条 SQL 语句),同时把这 n 条记录关联的 B, C 记录也查出来(这里需要n
条查询 B 的语句和n
条查询 C 的语句),于是最后需要的 SQL 语句数目为2n + 1
.将
2n
抽象出来,假设需要查找的是 n 条 A 的记录(count(SQL) = 1
),同时需要把与 A 关联的 k 个模型的记录也查找处理出来(count(SQL) = n * k
), 设n * k = N
, 最后查询的 SQL 语句数目,即N + 1
Laravel 中解决 N + 1 问题
- 使用预加载功能
- 使用
with()
方法,会做缓存with()
中放需要查询的关联属性
本帖已被设为精华帖!
本帖由系统于 6年前 自动加精
总结 是个好习惯啊
总结的真是好。
这玩意真好用啊