Những sai lầm phổ biến dẫn đến vấn đề truy vấn N+1 thường xoay quanh cách dữ liệu được tìm nạp từ cơ sở dữ liệu, đặc biệt là khi sử dụng các khung hình ánh xạ quan hệ đối tượng (ORM) hoặc viết truy vấn cơ sở dữ liệu theo cách thủ công. Dưới đây là những giải thích chi tiết về những sai lầm này:
** 1. Tìm nạp dữ liệu liên quan trong các truy vấn riêng biệt
Một nguyên nhân chính của vấn đề truy vấn N+1 là cấu trúc mã để truy xuất danh sách các bản ghi bằng một truy vấn, sau đó thực hiện một truy vấn bổ sung cho mỗi bản ghi để tìm nạp dữ liệu liên quan. Ví dụ: truy vấn danh sách người dùng và sau đó truy vấn riêng các bài đăng cho mỗi người dùng dẫn đến 1 truy vấn cho người dùng cộng với N truy vấn cho bài đăng, trong đó n là số lượng người dùng. Điều này dẫn đến nhiều truy vấn nhỏ thay vì một truy vấn được tối ưu hóa [1] [2] [3] [7].
** 2. Dựa vào tải lười biếng theo mặc định
Hầu hết các Orms sử dụng tải lười biếng làm chiến lược tìm nạp mặc định, có nghĩa là các thực thể liên quan chỉ được tìm nạp khi truy cập rõ ràng. Mặc dù điều này có thể lưu tài nguyên nếu không cần dữ liệu liên quan, nhưng nó khiến nhiều truy vấn được kích hoạt khi lặp lại trên các bộ sưu tập, vô tình gây ra vấn đề N+1. Chẳng hạn, truy cập tác giả của mỗi bài đăng trên blog kích hoạt riêng một truy vấn riêng cho mỗi bài đăng [5].
** 3. Tái sử dụng các truy vấn mù mù mà không cần điều chỉnh theo ngữ cảnh
Việc sử dụng lại cùng một truy vấn trên các phần khác nhau của một ứng dụng mà không điều chỉnh nó có thể gây ra việc truy xuất dữ liệu không cần thiết và làm trầm trọng thêm vấn đề N+1. Các truy vấn không được tối ưu hóa cho các trường hợp sử dụng cụ thể có thể tìm nạp dữ liệu không đầy đủ, nhắc các truy vấn bổ sung để tìm nạp thông tin liên quan sau [8].
** 4. Không sử dụng các kỹ thuật tối ưu hóa tải hoặc truy vấn háo hức
Không sử dụng tải háo hức (tìm nạp dữ liệu liên quan trong truy vấn ban đầu) hoặc các kết nối được tối ưu hóa kết quả trong nhiều vòng tròn vào cơ sở dữ liệu. Điều này xảy ra khi các nhà phát triển không hướng dẫn rõ ràng ORM hoặc người xây dựng truy vấn của họ để tải các thực thể liên quan đến nhau, dẫn đến nhiều truy vấn nhỏ thay vì một bản duy nhất, hiệu quả [5] [6] [7].
** 5. Bỏ qua tác động của nhiều vòng tròn vào cơ sở dữ liệu
Các nhà phát triển đôi khi cho rằng nhiều truy vấn nhỏ nhanh hơn một truy vấn phức tạp, nhưng mỗi truy vấn liên quan đến độ trễ mạng và chi phí xử lý. Hiệu ứng tích lũy của các truy vấn N+1 làm chậm đáng kể thời gian phản hồi ứng dụng và tăng tải cơ sở dữ liệu, đặc biệt là khi khối lượng dữ liệu tăng lên [1] [3] [5].
** 6. Thiếu nhận thức hoặc phát hiện vấn đề
Bởi vì mỗi truy vấn riêng lẻ trong mẫu N+1 chạy nhanh, nó thường không xuất hiện trong các nhật ký truy vấn chậm hoặc các công cụ giám sát, khiến nó trở thành một kẻ giết người hiệu suất im lặng. Các nhà phát triển có thể không nhận thấy vấn đề cho đến khi khả năng đáp ứng của ứng dụng giảm đáng kể [2] [5] [7].
Tóm lại, vấn đề truy vấn N+1 phát sinh chủ yếu do dữ liệu không hiệu quả tìm nạp các mẫu cụ thể, truy vấn dữ liệu liên quan trong các truy vấn riêng biệt cho mỗi bản ghi thay vì các truy vấn ghép hoặc tham gia. Điều này thường được gây ra bởi việc tải lười biếng mặc định trong các orms, không sử dụng tải hoặc hàng loạt háo hức và tái sử dụng các truy vấn chung mà không tối ưu hóa. Kết quả là các vòng tròn cơ sở dữ liệu quá mức làm giảm hiệu suất và khả năng mở rộng [1] [2] [3] [5] [6] [7].
Trích dẫn:
[1] https://planetscale.com/blog/what-is-n-1-query-problem-and-how-to-solve-it
[2] https://stackoverflow.com/questions/97197/what-is-the-n1-selects-problem-in-orm-object-relational-mapping
.
.
[5] https:
[6] https://www.linkedin.com/posts/aftab-ahmed-bb002827_avoiding-the-n1-query-problem-a-common-activity-7270527662970818561-ZMz6
[7] https://dev.to/lovestaco/the-n1-query-problem-the-silent-performance-killer-2b1c
.