您可以通过遵循以下步骤并了解其提供的功能,有效地使用Laravel Debugbar在Laravel应用程序中识别N+1查询问题:
##什么是n+1查询问题?
当您的应用程序运行一个查询以检索一组记录(n),然后对每个记录进行额外查询以获取相关数据,从而导致n+1查询总计,总共会发生n+1查询问题。由于数据库查询过多,这会导致性能降解[4] [5]。
##使用Laravel Debugbar检测N+1查询
- 安装和设置:首先,如果尚未安装,请通过作曲家安装Laravel Debugbar。它与Laravel无缝集成,并提供了一个可视接口来监视请求期间执行的查询[1] [5]。
- 实时查询监视:Laravel Debugbar显示在请求中执行的所有SQL查询,包括查询数及其执行时间。这使您可以在反复运行许多类似的查询时发现,这是N+1问题的标志[1] [5]。
- 详细的查询信息:Debugbar提供了有关每个查询的详细信息,包括触发查询的代码中的文件和行号。这有助于查明引起N+1查询的确切代码,这在较大的项目中是无价的[8]。
- N+1查询的自定义消息:与Laravel查询检测器包(与Debugbar集成)结合使用时,它可以通过在Debugbar的界面中添加警告或消息来明确突出显示N+1查询。该软件包检测何时执行关系查询多次阈值次数,并通知您添加急切的加载[2] [3]。
##如何使用debugbar识别n+1查询
1。启用Debugbar在开发中:确保在本地或开发环境中启用Debugbar,以避免在生产中揭示查询细节。
2。加载您要测试的页面或路由:导航到怀疑有n+1个问题的页面。
3。打开debugbar面板:在debugbar接口(通常在浏览器的底部)中,转到“查询”选项卡。
4。观察查询数:查找重复的查询,这些查询相似但因参数值而差异,表明多个查询从一一获取相关数据。
5。检查查询起源:单击单个查询以查看执行查询的堆栈跟踪或文件/行号。这有助于确定导致N+1问题的确切循环或代码部分。
6。使用Laravel查询检测器进行警报:可选,安装Laravel查询检测器软件包,当检测到n+1查询时,可以在Debugbar中添加警报,从而在不手动计数查询的情况下更易于发现[3]。
##识别后的最佳实践
- 在雄辩的查询中使用急切的加载(`with()`)预订相关模型并减少查询数量。
- 使用Laravel的内置预防,通过添加模型:: Desporllazyloading(!App() - > isproduction())``appServiceProvider`在开发过程中都会在懒惰负载上施加异常,从而帮助早日捕获N+1查询[4] [9]。
- 在开发过程中连续监视Debugbar的查询,以保持最佳查询性能。
通过利用Laravel Debugbar的查询可视化和集成Laravel查询探测器(例如Laravel查询检测器),您可以有效地识别和解决N+1查询问题,从而显着改善了应用程序的数据库性能[1] [2] [3] [5]。
引用:
[1] https://www.luckymedia.dev/blog/laravel-for-beginners-query-performance-issues
[2] https://github.com/beyondcode/laravel-query-detector
[3] https://beyondco.de/docs/laravel-query-detector/usage
[4] https://laravel-news.com/laravel-n1-query-problems
[5] https://www.linkedin.com/pulse/handling-n1-query-problem-laravel-developers-haseeb-mushtaq-udusf
[6] https://laraveldaily.com/lesson/laravel-eloquent-expert/n1-query-packages-examples
[7] https://laraveldaily.com/lesson/eloquent-performance/n1-query-debugbar-eager-loading
[8] https://www.reddit.com/r/laravel/comments/5f7y9f/debugging_the_amount_of_database_queries_queries_per/
[9] https://planetscale.com/blog/what-is-n-1-query-problem-and-problem-and-and-how-to-solve-it