N+1 là khi app chạy 1 query lấy danh sách, rồi lặp qua từng phần tử và bắn thêm 1 query con cho mỗi phần tử — 100 dòng thành 101 query, chậm nghiêm trọng. Cách xử lý: join/preload, gom thành một batch query với WHERE id = ANY(...), gộp JSON ngay trong SQL nếu cần, hoặc dùng pattern DataLoader ở GraphQL.
Ví dụ lấy gộp một lần:
sql
SELECT * FROM order_items
WHERE order_id = ANY($1);Điều quan trọng là đo số query và latency theo mỗi request.
Index đúng cũng không cứu nổi nếu app bắn hàng nghìn query nhỏ.