คุณสามารถใช้ Laravel Debugbar ได้อย่างมีประสิทธิภาพเพื่อระบุปัญหาการสืบค้น N+1 ในแอปพลิเคชัน Laravel ของคุณโดยทำตามขั้นตอนเหล่านี้และทำความเข้าใจกับคุณสมบัติที่มีให้:
ปัญหาการสืบค้น N+1 คืออะไร?
ปัญหาการสืบค้น N+1 เกิดขึ้นเมื่อแอปพลิเคชันของคุณเรียกใช้หนึ่งการสืบค้นเพื่อดึงชุดบันทึก (n) จากนั้นเรียกใช้การสืบค้นเพิ่มเติมสำหรับแต่ละระเบียนเพื่อดึงข้อมูลที่เกี่ยวข้องส่งผลให้ 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) มันสามารถเน้นการสืบค้น N+1 อย่างชัดเจนโดยการเพิ่มคำเตือนหรือข้อความภายในอินเทอร์เฟซของ Debugbar แพ็คเกจนี้ตรวจพบเมื่อมีการดำเนินการแบบสอบถามความสัมพันธ์มากกว่าจำนวนครั้งที่กำหนดและแจ้งให้คุณเพิ่มการโหลดที่กระตือรือร้น [2] [3]
วิธีใช้ debugbar เพื่อระบุ n+1 แบบสอบถาม
1. เปิดใช้งาน Debugbar ในการพัฒนา: ตรวจสอบให้แน่ใจว่า Debugbar เปิดใช้งานในสภาพแวดล้อมในพื้นที่หรือการพัฒนาของคุณเพื่อหลีกเลี่ยงการเปิดเผยรายละเอียดการสอบถามในการผลิต
2. โหลดหน้าเว็บหรือเส้นทางที่คุณต้องการทดสอบ: นำทางไปยังหน้าเว็บที่สงสัยว่ามีปัญหา N+1
3. เปิดแผง Debugbar: ในอินเตอร์เฟส debugbar (โดยปกติจะอยู่ที่ด้านล่างของเบราว์เซอร์) ไปที่แท็บ "แบบสอบถาม"
4. สังเกตจำนวนการสืบค้น: มองหาการสืบค้นซ้ำที่คล้ายกัน แต่แตกต่างกันตามค่าพารามิเตอร์แสดงการค้นหาหลายครั้งการดึงข้อมูลที่เกี่ยวข้องทีละตัว
5. ตรวจสอบต้นกำเนิดการสืบค้น: คลิกที่แบบสอบถามแต่ละรายการเพื่อดูการติดตามสแต็กหรือหมายเลขไฟล์/บรรทัดที่มีการดำเนินการแบบสอบถาม สิ่งนี้จะช่วยระบุส่วนลูปหรือรหัสที่แน่นอนทำให้เกิดปัญหา N+1
6. ใช้เครื่องตรวจจับการสืบค้น Laravel สำหรับการแจ้งเตือน: ทางเลือกติดตั้งแพ็คเกจตรวจจับการสืบค้น Laravel ซึ่งสามารถเพิ่มการแจ้งเตือนภายใน debugbar เมื่อตรวจพบ N+1 แบบสอบถามทำให้ง่ายต่อการมองเห็นโดยไม่ต้องนับด้วยตนเอง [3]
แนวทางปฏิบัติที่ดีที่สุดหลังจากการระบุตัวตน
- ใช้การโหลดกระตือรือร้น (`กับ ()`) ในการสืบค้นที่มีคารมคมคายของคุณเพื่อโหลดโมเดลที่เกี่ยวข้องล่วงหน้าและลดจำนวนการสืบค้น
-ใช้การป้องกันในตัวของ Laravel โดยการเพิ่ม `model :: preventlazyloading (! app ()-> isproduction ())` ใน `appserviceprovider` ของคุณเพื่อโยนข้อยกเว้นเกี่ยวกับการโหลดขี้เกียจในระหว่างการพัฒนาช่วยจับ n+1 ก่อน [4] [9]
- ตรวจสอบการสืบค้นอย่างต่อเนื่องกับ Debugbar ในระหว่างการพัฒนาเพื่อรักษาประสิทธิภาพการสืบค้นที่ดีที่สุด
ด้วยการใช้ประโยชน์จากการสร้างภาพการสืบค้นและการรวมเครื่องมือของ Laravel Debugbar และการรวมเครื่องมือเช่น Laravel Query Detector คุณสามารถระบุและแก้ไขปัญหาการสืบค้น N+1 ได้อย่างมีประสิทธิภาพปรับปรุงประสิทธิภาพฐานข้อมูลแอปพลิเคชันของคุณอย่างมีนัยสำคัญ [1] [2] [3] [5]
การอ้างอิง:
[1] https://www.luckymedia.dev/blog/laravel-for-beginners-perery-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_per/
[9] https://planetscale.com/blog/what-is--n-1-query-problem-and-how-to-o-solve-it