Laravel慢查询排查有五种方法:一、启用DB::enableQueryLog筛选耗时>200ms的SQL;二、用Debugbar可视化追踪N+1及重复查询;三、通过Telescope全链路监控并按300ms阈值筛选;四、在AppServiceProvider中全局监听>500ms查询并告警;五、对慢SQL执行EXPLAIN分析索引使用与执行计划。

如果您在使用 Laravel 框架时发现接口响应缓慢,页面加载延迟明显,很可能是数据库中存在执行时间过长的慢查询。这些查询往往隐藏在 Eloquent 调用、关联加载或复杂条件筛选背后,需借助系统化手段主动捕获与识别。以下是几种可立即实施的瓶颈排查方法。
一、启用原生查询日志并筛选耗时条目
该方法直接利用 Laravel 内置的查询日志机制,无需额外依赖,适用于所有环境(开发/测试),能获取原始 SQL、绑定参数及精确执行毫秒数,是定位慢查询的第一道防线。
1、在目标路由、控制器方法或 Artisan 命令开头插入:DB::enableQueryLog()。
2、执行待测业务逻辑,例如调用 User::with('posts')->get() 或完整 HTTP 请求。
3、在逻辑结束后立即调用:$queries = DB::getQueryLog() 获取全部日志数组。
4、遍历 $queries,提取每个元素的 time 字段,筛选出 time > 200 的记录(单位:毫秒)。
5、对筛选结果打印 SQL 语句与绑定值,确认是否含未加索引的 WHERE 条件、无限制的 SELECT * 或嵌套子查询。
二、使用 Laravel Debugbar 实时可视化追踪
Debugbar 在浏览器端提供图形化界面,可直观展示每次请求的数据库调用次数、单条 SQL 执行时间、重复查询标识及调用堆栈路径,特别适合快速识别 N+1 查询与高频低效语句。
1、执行安装命令:composer require barryvdh/laravel-debugbar --dev。
2、发布配置:php artisan vendor:publish --provider="Barryvdh\Debugbar\ServiceProvider"。
3、确保 APP_DEBUG=true 且 DEBUGBAR_ENABLED=true 在 .env 中启用。
4、访问目标页面,在底部 Debugbar 面板点击 Database 标签页。
5、按 Time (ms) 列倒序排列,定位顶部耗时最高的 SQL;检查 Duplicates 数值是否大于 1,确认是否存在重复执行的相同查询。
三、通过 Laravel Telescope 监控全链路数据库活动
Telescope 是 Laravel 官方推荐的调试与监控中心,可持久化存储每条数据库查询的完整上下文,包括执行时间、SQL 原文、绑定参数、调用文件与行号,支持按时间范围、执行时长、SQL 模式等多维过滤,适用于生产环境灰度排查。
1、安装 Telescope:composer require laravel/telescope --dev。
2、发布迁移与配置:php artisan telescope:install,随后运行 php artisan migrate。
3、启动队列监听器以保障数据写入(如使用 database 驱动):php artisan telescope:work。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
4、访问 /telescope 页面,进入 Queries 标签页。
5、设置筛选条件:选择 Slowest first 排序,并将 Duration 阈值设为 300ms,点击搜索。
6、点击任一慢查询条目,查看 Stack Trace 定位到具体控制器方法或服务类中的哪一行触发了该 SQL。
四、在 AppServiceProvider 中全局拦截超时查询并告警
该方法实现被动防御机制,当任意查询超过预设阈值(如 500ms)时,自动记录日志、触发 Slack/Email 通知或写入独立监控表,适用于长期运行服务中持续发现新出现的慢查询。
1、在 app/Providers/AppServiceProvider.php 的 boot() 方法内添加监听器:
2、插入代码:DB::listen(function ($query) { if ($query->time > 500) { \Log::warning('SLOW QUERY DETECTED', [ 'sql' => $query->sql, 'bindings' => $query->bindings, 'time' => $query->time ]); } });。
3、确保日志通道配置为 daily 或 stack,避免单文件过大。
4、复现慢操作,检查 storage/logs/laravel-*.log 是否生成对应警告条目。
5、从日志中提取 sql 字段内容,粘贴至 MySQL 客户端执行 EXPLAIN FORMAT=JSON 分析执行计划。
五、对可疑 SQL 执行 EXPLAIN 分析执行计划
EXPLAIN 是数据库层面的“X光”,可揭示查询是否命中索引、是否发生全表扫描、是否使用临时表或文件排序等关键性能线索,是优化前必做的诊断步骤。
1、从前述任一方法中复制慢查询的完整 SQL(注意替换 ? 占位符为实际值,或使用 PDO 绑定方式构造等效语句)。
2、在 MySQL 命令行或 phpMyAdmin 中执行:EXPLAIN FORMAT=JSON SELECT ...。
3、重点检查返回 JSON 中的 key 字段是否为 NULL(表示未用索引);rows 字段是否远超预期返回行数;type 是否为 ALL(全表扫描)或 index_merge(索引合并效率低)。
4、若发现 Extra 包含 Using filesort 或 Using temporary,说明 ORDER BY 或 GROUP BY 未走索引,需调整排序字段或添加覆盖索引。
5、根据分析结果,在对应字段上创建单列索引或复合索引,例如:ALTER TABLE users ADD INDEX idx_status_created_at (status, created_at);。










