Bạn có thể sử dụng Laravel Debugbar một cách hiệu quả để xác định các vấn đề truy vấn N+1 trong ứng dụng Laravel của mình bằng cách làm theo các bước này và hiểu các tính năng mà nó cung cấp:
Vấn đề truy vấn N+1 là gì?
Vấn đề truy vấn N+1 xảy ra khi ứng dụng của bạn chạy một truy vấn để truy xuất một tập hợp các bản ghi (N), sau đó chạy một truy vấn bổ sung cho mỗi bản ghi để tìm nạp dữ liệu liên quan, dẫn đến tổng số truy vấn N+1. Điều này dẫn đến suy giảm hiệu suất do các truy vấn cơ sở dữ liệu quá mức [4] [5].Sử dụng Laravel Debugbar để phát hiện các truy vấn N+1
- Cài đặt và thiết lập: Đầu tiên, cài đặt Laravel Debugbar thông qua Trình soạn thảo nếu chưa cài đặt. Nó tích hợp liền mạch với Laravel và cung cấp giao diện trực quan để giám sát các truy vấn được thực thi trong một yêu cầu [1] [5].
- Giám sát truy vấn thời gian thực: Laravel Debugbar hiển thị tất cả các truy vấn SQL được thực hiện trong một yêu cầu, bao gồm số lượng truy vấn và thời gian thực hiện của chúng. Điều này cho phép bạn phát hiện ra khi nhiều truy vấn tương tự được chạy nhiều lần, một dấu hiệu của các vấn đề N+1 [1] [5].
- Thông tin truy vấn chi tiết: DebugBar cung cấp thông tin chi tiết về từng truy vấn, bao gồm cả tệp và số dòng trong mã của bạn nơi truy vấn được kích hoạt. Điều này giúp xác định chính xác mã chính xác gây ra các truy vấn N+1, là vô giá trong các dự án lớn hơn [8].
- Tin nhắn tùy chỉnh cho các truy vấn N+1: Khi kết hợp với gói máy dò truy vấn Laravel (tích hợp với DebugBar), nó có thể làm nổi bật các truy vấn N+1 một cách rõ ràng bằng cách thêm các cảnh báo hoặc tin nhắn bên trong giao diện DebugBar. Gói này phát hiện khi truy vấn quan hệ được thực thi nhiều hơn một số lần và thông báo cho bạn để thêm tải háo hức [2] [3].
Cách sử dụng DebugBar để xác định các truy vấn N+1
1. Kích hoạt DebugBar trong phát triển: Đảm bảo DebugBar được kích hoạt trong môi trường địa phương hoặc phát triển của bạn để tránh phơi bày các chi tiết truy vấn trong sản xuất.
2. Tải trang hoặc tuyến bạn muốn kiểm tra: Điều hướng đến trang nghi ngờ có vấn đề N+1.
3. Bảng Debugbar mở: Trong giao diện DebugBar (thường ở dưới cùng của trình duyệt), hãy chuyển đến tab "Truy vấn".
4. Quan sát số lượng truy vấn: Tìm các truy vấn lặp lại tương tự nhưng khác nhau theo giá trị tham số, chỉ ra nhiều truy vấn tìm nạp từng dữ liệu liên quan.
5. Kiểm tra nguồn gốc truy vấn: Nhấp vào các truy vấn riêng lẻ để xem dấu vết ngăn xếp hoặc số tệp/dòng nơi truy vấn được thực thi. Điều này giúp xác định vòng lặp chính xác hoặc phần mã gây ra vấn đề N+1.
6. Sử dụng máy dò truy vấn Laravel để cảnh báo: Tùy chọn, cài đặt gói máy dò truy vấn Laravel có thể thêm cảnh báo bên trong DebugBar khi phát hiện ra các truy vấn N+1, giúp dễ dàng phát hiện ra mà không cần tính truy vấn thủ công [3].
Thực tiễn tốt nhất sau khi nhận dạng
- Sử dụng tải háo hức (`với ()`) trong các truy vấn hùng hồn của bạn để tải trước các mô hình liên quan và giảm số lượng truy vấn.
-Sử dụng phòng ngừa tích hợp của Laravel bằng cách thêm `model :: strectlazyloading (! App ()-> isproduction ())` Trong `appserviceProvider` của bạn để đưa ra các ngoại lệ về tải lười biếng trong quá trình phát triển, giúp bắt N+1 truy vấn sớm [4] [9].
- Liên tục giám sát các truy vấn với DebugBar trong quá trình phát triển để duy trì hiệu suất truy vấn tối ưu.
Bằng cách tận dụng các công cụ truy vấn của Laravel Debugbar và tích hợp các công cụ như máy dò truy vấn Laravel, bạn có thể xác định và khắc phục hiệu quả các vấn đề truy vấn N+1, cải thiện đáng kể hiệu suất cơ sở dữ liệu của ứng dụng [1] [2] [3] [5].
Trích dẫn:
[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
.
[9] https://planetscale.com/blog/what-is-n-1-query-problem-and-how-to-solve-it