Bạn đã từng nghe về các truy vấn N+1 chưa? Nếu chưa, đừng lo lắng - đây là một vấn đề phổ biến trong phát triển web, nhưng chúng ta có một công cụ hữu ích để giúp xác định và giải quyết nó. Hãy nói về gem bullet https://github.com/flyerhzm/bullet!
Thay vì chỉ giám sát các truy vấn, Bullet hoạt động như một người bảo vệ cảnh giác, xem xét kỹ lưỡng mã của bạn để tìm ra các điểm nghẽn hiệu suất. Nó xác định các khu vực cần cải thiện bằng cách đánh dấu các vấn đề truy vấn N+1, eager loading không cần thiết, và đề xuất sử dụng bộ đếm cache.
Hãy tưởng tượng việc viết thư cho tất cả bạn cùng lớp và hỏi về cuốn sách yêu thích của họ. Bạn có thể làm điều này:
Đây giống như một truy vấn N+1. Bạn thực hiện một yêu cầu để lấy danh sách (1), sau đó một yêu cầu cho mỗi bạn cùng lớp (N). Nếu bạn có 30 bạn cùng lớp, đó là 31 yêu cầu! Đó là rất nhiều công việc và có thể làm chậm trang web của bạn.
Gem bullet giống như một robot thân thiện xem xét trang web của bạn và cho bạn biết khi bạn đã thực hiện quá nhiều yêu cầu với N+1. Nó rất dễ sử dụng:
Cách thực hành tốt nhất là sử dụng Bullet trong chế độ phát triển hoặc chế độ tùy chỉnh (staging, profile, v.v.). Để biết thêm thông tin, hãy truy cập https://github.com/flyerhzm/bullet.
Khi bullet chỉ ra một vấn đề, bạn có thể sửa nó. Thay vì hỏi từng bạn cùng lớp riêng lẻ, bạn có thể hỏi tất cả cùng một lúc, "Này các bạn, cuốn sách yêu thích của các bạn là gì?" Điều này nhanh hơn nhiều!
Hãy phân tích tại sao việc hỏi mọi người cùng một lúc lại nhanh hơn:
Trong thuật ngữ cơ sở dữ liệu, cách tiếp cận này để lấy tất cả thông tin cùng một lúc được gọi là "eager loading". Nó giống như việc lấp đầy toàn bộ ba lô của bạn với sách trong một lần, thay vì đi đi lại lại từ tủ cho mỗi lớp học.
Từ góc độ lập trình, chúng ta sử dụng các đối tượng "eager loading" hoặc "includes" để lấy tất cả thông tin chúng ta cần cùng một lúc.
Ngăn chặn các truy vấn N+1 có thể tăng tốc đáng kể trang web của bạn. Các trang web nhanh hơn giúp người dùng hài lòng, sử dụng ít năng lượng hơn, và thậm chí có thể xếp hạng cao hơn trong các công cụ tìm kiếm.
Hãy nhớ rằng việc viết mã hiệu quả là một kỹ năng quan trọng đối với bất kỳ nhà phát triển nào. Các công cụ như gem bullet giúp chúng ta học hỏi và cải thiện mã của mình.