💬 1. Bản chất của N+1 Query
Vấn đề N+1 xảy ra khi chúng ta thực hiện 1 truy vấn ban đầu lấy danh sách (ví dụ: 100 bài viết) và sau đó thực hiện N truy vấn riêng biệt (100 truy vấn) để lấy dữ liệu liên quan cho từng mục (ví dụ: thông tin tác giả, bình luận, v.v.).
Hậu quả:
- Latency (Độ trễ) tăng vọt.
- Overhead: 101 lần round-trip Network giữa App Server và Database Server.
- Database Load: tăng tải DB
- Scalability: giảm khả năng mở rộng hệ thống trầm trọng.
Giải pháp kinh điển: JOIN - Giảm N+1 truy vấn xuống còn 1.
Tuy nhiên, cũng có nhiều hệ lụy
- Cartesian Product: Tạo ra tập kết quả khổng lồ, dư thừa dữ liệu (nếu một bài viết có 100 bình luận, nó sẽ lặp lại dữ liệu bài viết 100 lần), gây tốn bộ nhớ và I/O lớn hơn cho App Server.
- Khó khăn trong việc Caching: Tập kết quả lớn, thay đổi thường xuyên, khó cache toàn bộ.
💥 2. Phương án Kết hợp với Item-Level Caching
Tôi từng làm ở một công ty xây dựng core framework lớn - Optimizely (Premium partner của Microsoft) và chúng tôi ứng dụng chiến lược này.
Và đây là lúc chúng ta thay đổi tư duy. Khi một hệ thống đã có lớp Caching mạnh mẽ (Redis, Memcached, hoặc thậm chí In-Memory Cache có phân phối), N+1 query lạ là vấn đề nữa, mà trở thành một chiến lược truy cập dữ liệu tốt.
Chiến lược đơn giản như sau: 1 Query (List) + N Query (Cache Lookups)
Hành động:
- Query (1)L Lấy danh sách ID cơ bản (ví dụ: SELECT PostId FROM Posts WHERE...). Query này nhanh, nhẹ, và có thể được Cache toàn bộ Page.
- Query (N) - Truy cập từng Item, thay vì gọi DB, hệ thống gọi Cache cho từng item (ví dụ: Cache.Get<Author>(AuthorId)).
- Hit Cache (hầu hết), độ trễ cực thấp, là Microseconds (thường < 1ms), không có Network Round-trip đến DB.
- Miss Cache (trường hợp lấy lần đầu), chỉ list item đó gọi DB. Sau đó, item này được đưa vào Cache, sẵn sàng cho các lần truy cập tiếp theo.
🤞 3. Nghệ thuật tối ưu luôn là sự Cân bằng
Trong system design hiện dại, Database luôn là nút thắt cổ chai đắt đỏ nhất.
Tuy nhiên, không phải 1 chiến lược lúc nào cũng đúng. Tùy từng thời điểm, từng bài toán áp dụng, khi cần JOIN query, chúng ta vẫn dùng, khi cần N+1 query, chúng ta vẫn dùng. Tìm phương án tối ưu cho mỗi bài toán là mục tiêu tối thượng của 1 đứa dev như chúng ta :)
Bạn đã áp dụng chiến lược này trong hệ thống của mình bao giờ chưa?
ItemLevelCaching DotNet SeniorDeveloper SystemOptimization PerformanceTuning CachingStrategy wecommit100xshare
Công nghệ - 19/08/2025 21:13:07
Tìm hiểu cách xây dựng hệ thống phát hiện ngôn ngữ ký hiệu theo thời gian thực bằng AI, sử dụng DETR để tăng cường khả năng tiếp cận và đổi mới. Kết nối lời nói và cử chỉ.
Công nghệ - 18/08/2025 13:38:25
Tối ưu hóa các hệ thống RAG bằng cách tận dụng siêu dữ liệu để truy xuất thông tin chính xác và nhanh chóng hơn, giải quyết các thách thức về dữ liệu dư thừa hoặc lỗi thời với công cụ LangExtract nguồn mở. Khám phá cách LangExtract sử dụng các mô hình ngôn ngữ tiên tiến để trích xuất và cấu trúc siêu dữ liệu, tạo ra một quy trình truy xuất hợp lý và hiệu quả.
Công nghệ - 01/08/2025 07:00:00
Gỡ lỗi LLM rất quan trọng vì quy trình làm việc của chúng phức tạp và liên quan đến nhiều phần như chuỗi, lời nhắc, API, công cụ, trình truy xuất, v.v.
Công nghệ - 19/06/2025 03:05:09
Code xong chạy được là chưa đủ – phải biết khi nào nó "chết" nữa chứ 😅
Bạn đang triển khai ứng dụng trên Kubernetes, Docker hay môi trường production nào? Và bạn từng "toát mồ hôi" vì service chết mà không ai báo?
Công nghệ - 16/07/2025 13:41:17
Công nghệ - 27/06/2025 03:15:44
Công nghệ - 11/12/2025 15:05:29
[Góc chuyện nghề] bán account game để đi học nghệ - bạn dám không?
Làm nghề 20 năm, gặp nhiều sinh viên, nhưng chiều qua tôi khá bất ngờ với một cậu em tên Quang. Em Quang muốn theo nghề BA và mong muốn lương 20 triệu sau khi làm việc 1.5 năm tới 2 năm trong nghề.
Công nghệ - 22/09/2025 08:59:20
Dừng ngay việc dùng DateTime.Now trong APIs, đó là ổ lỗi tiềm ẩn trong hệ thống của bạn
⏱️ Tôi từng nghĩ DateTime.Now là một thứ vô hại, đơn giản và tiện lợi, cho đến khi gặp những vấn đề về múi giờ. Những lỗi "tưởng chừng nhỏ" này lại chính là nguồn cơn của sự thất vọng và tốn kém thời gian cho nhiều đội ngũ phát triển.
Công nghệ - 14/03/2025 04:30:32