首先启用查询日志并记录执行时间,使用DB::enableQueryLog()捕获SQL语句及耗时,筛选time>100ms的慢查询;接着通过Laravel Debugbar可视化分析数据库调用次数与重复查询;再利用Telescope监控所有数据库活动,查看执行时间与调用位置;同时在AppServiceProvider中使用DB::listen拦截超时查询并写入日志;最后对慢查询执行EXPLAIN分析执行计划,检查索引使用情况,避免全表扫描与文件排序,优化SQL性能。
如果您在使用 Laravel 开发应用时发现数据库查询响应缓慢,可能是由于未优化的 SQL 查询或频繁的数据库调用导致。为了定位性能瓶颈,需要对数据库查询进行详细分析。以下是几种有效的性能分析方法。
本文运行环境:MacBook Pro,mac OS Sonoma
一、启用查询日志并记录执行时间
通过开启 Laravel 的查询日志功能,可以捕获所有执行的 SQL 语句及其执行时间,便于后续分析慢查询。
1、在代码中启用查询日志:
DB::enableQueryLog()。
2、执行您要测试的业务逻辑,例如调用某个控制器方法或服务。
3、获取查询日志数据:
DB::getQueryLog(),返回包含 SQL、绑定参数和执行时间的数组。
4、遍历日志,筛选出执行时间较长的查询,重点关注
time 值大于 100ms的条目。
二、使用 Laravel Debugbar 进行可视化分析
Laravel Debugbar 是一个开发调试工具,能够在页面底部显示详细的请求信息,包括数据库查询次数、SQL 内容和执行时间。
1、通过 Composer 安装 Debugbar:composerrequire barryvdh/laravel-debugbar --dev。
2、发布
配置文件:phpartisan vendor:publish --provider="Barryvdh\Debugbar\ServiceProvider"。
3、访问目标页面,查看底部 Debugbar 面板中的 Database 选项卡。
4、检查查询数量是否过多,是否存在重复查询,并点击单条 SQL 查看其执行堆栈。
三、利用 Laravel Telescope 监控数据库活动
Laravel Telescope 提供了强大的本地开发监控能力,能够记录数据库查询、请求、异常等信息。
1、安装 Telescope:composer require laravel/telescope。
PHP 8.5.5 PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
2、发布资源:
php artisan telescope:install并运行迁移命令。
3、启动服务后访问
/telescope路径进入仪表盘。
4、切换到 Queries 标签页,查看所有数据库操作的详细信息,包括运行时间、影响行数和调用位置。
四、使用 DB::listen 拦截慢查询
通过监听数据库查询事件,可以在每次查询执行后判断其耗时,并将超过阈值的查询记录到日志中。
1、在 AppServiceProvider 的 boot 方法中添加监听器:DB::listen。
2、设置监听
回调函数,接收 $query、$bindings、$time 和 $connection 参数。
3、判断 $time 是否超过预设阈值(如 50ms),若超过则写入日志:Log::warning('Slow query', [...])。
4、结合 Laravel 日志系统,定期检查 storage/logs 中的慢查询记录。
五、结合 EXPLAIN 分析 SQL 执行计划
对于发现的慢查询,使用 EXPLAIN 命令分析其执行计划,确认是否使用索引、是否存在全表扫描等问题。
1、复制可疑的 SQL 语句,在数据库客户端中执行:EXPLAIN SELECT ...
。
2、查看输出结果中的 type、key、rows 和 Extra 字段。
3、确认是否使用了正确的索引,
避免出现 type=ALL 或 Extra=Using filesort。
4、根据分析结果优化 SQL 或添加合适的数据库索引。
