CodeReady
Quay lại danh sách case study

Tối ưu hóa truy vấn cơ sở dữ liệu và xử lý N+1 Query trong Node.js ORM

Khắc phục triệt để hiện tượng nghẽn cổ chai cơ sở dữ liệu do lỗi N+1 query và thiếu chỉ mục trên hệ thống báo cáo.

Bối cảnh

Hệ thống phân tích dữ liệu người dùng gặp tình trạng quá tải CPU và RAM trên cụm PostgreSQL, dẫn đến sập toàn bộ dịch vụ backend định kỳ mỗi giờ cao điểm.

Vấn đề cần xử lý

Sử dụng ORM (như Sequelize/Prisma) một cách thiếu kiểm soát gây ra hàng ngàn câu lệnh SQL riêng lẻ cho mỗi yêu cầu lấy danh sách kèm quan hệ (N+1 query problem).

Hướng xử lý đề xuất

Thực hiện audit toàn bộ câu lệnh SQL thông qua công cụ log của cơ sở dữ liệu, viết lại các truy vấn sử dụng JOIN hoặc DataLoader batching, đồng thời bổ sung các Composite Index phù hợp.

Câu trả lời mẫu khi phỏng vấn

Khi kiểm tra hệ thống, tôi phát hiện một trang danh sách đơn giản nhưng phát sinh tới 1.500 câu lệnh SQL do lỗi N+1 trong ORM. Tôi đã tiến hành refactor các truy vấn này sử dụng kỹ thuật DataLoader để gom nhóm (batching) và caching, kết hợp với việc tạo thêm các index tổng hợp trên PostgreSQL. Nhờ đó, số lượng câu lệnh SQL giảm 95% và thời gian phản hồi API từ 3 giây rút gọn xuống còn 45 mili-giây.

Trade-off

Việc sử dụng DataLoader đòi hỏi lập trình viên phải cẩn trọng với caching trong suốt vòng đời của một request HTTP để tránh đọc phải dữ liệu cũ.

Kết quả kỳ vọng

Giảm 90% tải trọng trên cụm cơ sở dữ liệu PostgreSQL, loại bỏ hoàn toàn các cảnh báo quá tải trong giờ cao điểm.

Bài học khi trả lời phỏng vấn

Sử dụng ORM tiện lợi nhưng các kỹ sư cấp cao phải luôn kiểm soát được câu lệnh SQL thực tế sinh ra bên dưới.