必须立即执行五步系统性调优:1.禁用持久连接并验证pdo复用;2.用with()预加载消除n+1查询;3.精简字段选择与分页控制数据集规模;4.按查询模式建复合索引并清理无用索引;5.用cache::remember缓存读多写少数据。

将Laravel应用在生产环境中数据库响应拖慢、查询耗时飙升、内存占用异常升高,必须立即执行五步系统性调优操作,跳过任意一步都可能导致性能无法达标。
禁用持久连接并验证PDO复用
1. 打开 config/database.php 文件,在 MySQL 配置块的 'options' 数组中显式添加 PDO::ATTR_PERSISTENT => false;
2. 在任意控制器中插入调试代码:dd(DB::connection()->getPdo() === DB::connection()->getPdo());,运行后必须输出 【true】,否则说明连接未复用,仍存在状态污染风险;
3. 检查 php.ini 中 mysql.allow_persistent 是否为 Off,若为 On 则需修改并重启 PHP-FPM。
用with()预加载消除N+1查询
方法一:定位循环内访问关联模型的代码,例如 $user->posts->count(),将其替换为 User::with('posts')->get();
方法二:对多级嵌套关系(如用户→部门→权限组),使用点号语法一次性预加载:User::with('department.permissionsGroup')->get();
方法三:在开发环境启用 DB::enableQueryLog(),请求结束后调用 dd(DB::getQueryLog()),确认查询总数从几十条降至 2~3 条。
精简字段选择与分页控制数据集规模
第一步:将所有 Model::get() 替换为显式字段列表,例如 User::select('id', 'name', 'email', 'updated_at')->get();
第二步:对前端列表接口强制使用 paginate(),如 Order::where('status', 'shipped')->paginate(15);
第三步:对后台导出或大数据处理场景,改用 chunk() 分批,例如 User::chunk(500, function ($users) { ... }),避免单次加载超 10 万行导致内存溢出。
按查询模式建复合索引并清理无用索引
执行 EXPLAIN SELECT * FROM users WHERE status = 1 AND created_at > '2026-01-01',观察 key 列是否为 NULL;
若为 NULL,则需在 users 表上创建复合索引:ALTER TABLE users ADD INDEX idx_status_created (status, created_at);;
删除长期未被 EXPLAIN 命中且超过 90 天无查询日志引用的索引,避免写入性能损耗。
用Cache::remember缓存读多写少数据
对不常变更但高频访问的数据(如站点配置、分类树、地区列表),直接包裹缓存逻辑:$categories = Cache::remember('frontend_categories', 3600, fn() => Category::where('is_active', 1)->get());;
注意:缓存键名必须唯一且可预测,避免因键冲突导致数据错乱;
缓存过期时间设为 3600 秒(1 小时)是生产环境安全起点,后续可根据更新频率动态调整。











