Trong các buổi phỏng vấn kỹ thuật, kiến thức về SQL & Cơ sở dữ liệu thường là 'hòn đá thử vàng' để đánh giá tư duy xử lý dữ liệu của ứng viên. Dù bạn code application rất tốt, một cách tiếp cận hời hợt hoặc thiếu hiểu biết về RDBMS vẫn có thể khiến bạn mất điểm đáng tiếc. Hãy cùng điểm qua 5 lỗi thường gặp nhất để bạn chuẩn bị chiến thuật tốt hơn cho vòng interview sắp tới.
Lạm dụng SELECT *
Nhiều ứng viên có thói quen viết 'SELECT *' để lấy dữ liệu nhanh chóng khi làm bài test. Đây là một điểm trừ lớn vì nó cho thấy bạn thiếu tư duy về mặt hiệu năng hệ thống trong môi trường production.
Việc lấy dư thừa cột không chỉ là vấn đề style code mà còn ảnh hưởng trực tiếp đến tài nguyên hệ thống.
- Lãng phí I/O: Database phải đọc cả những cột không cần thiết, làm tăng thời gian phản hồi.
- Tăng tải mạng: Dữ liệu truyền qua mạng lớn hơn mức cần thiết, đặc biệt với các cột chứa văn bản dài (BLOB/TEXT).
- Rủi ro Schema: Nếu bảng thay đổi cấu trúc hoặc rename column, mã nguồn phía ứng dụng có thể bị lỗi bất ngờ do thay đổi cấu trúc response.
Thiếu tư duy về Indexing và Tối ưu hóa
Khi được hỏi làm sao để tối ưu truy vấn chậm, nhiều ứng viên chỉ nói chung chung 'thêm index' mà không giải thích được 'tại sao' hoặc loại index nào là phù hợp.
Giám khảo muốn kiểm tra xem bạn có hiểu cách Database thực hiện truy vấn hay không.
- Không hiểu cơ chế B-Tree Index: Hãy chuẩn bị để giải thích cách Index giúp giảm độ phức tạp tìm kiếm từ O(N) xuống O(log N).
- Quên xem xét Cardinality: Index không hiệu quả trên cột có quá ít giá trị duy nhất (như cột giới tính trạng thái boolean).
- Over-indexing: Đừng quên nhắc rằng quá nhiều index sẽ làm chậm các thao tác ghi dữ liệu (INSERT/UPDATE/DELETE).
Nhầm lẫn giữa JOIN và các Set Operations
Câu hỏi về so sánh UNION vs UNION ALL hay INNER JOIN vs LEFT JOIN là kinh điển, nhưng nhiều người vẫn trả lời sai về bản chất logic thực thi của chúng.
Việc chọn sai toán tử không chỉ gây lỗi dữ liệu mà còn gây tắc nghẽn hiệu năng.
- UNION vs UNION ALL: UNION thực hiện việc gộp kết quả và lọc trùng (distinct), gây tốn thêm tài nguyên sort/deduplicate. Luôn ưu tiên UNION ALL nếu công việc không yêu cầu lọc trùng.
- Logic NULL trong JOIN: Khi dùng LEFT JOIN, cần hiểu rõ các hàng bị null ở bảng bên phải sẽ được xử lý ra sao trong các điều kiện WHERE hoặc ON.
- Thiếu hiểu biết về INNER JOIN: Đừng viết INNER JOIN mặc định khi bài toán thực sự yêu cầu lấy tất cả dữ liệu từ một bảng dù bảng kia không khớp.
Bỏ qua kiến thức về Transaction & Concurrency
Trong các hệ thống thực tế, việc nhiều user cùng cập nhật một bản ghi là thường xuyên. Ứng viên chỉ mạnh về DML (SELECT, INSERT) mà yếu về kiến thức concurrency là một lỗ hổng lớn.
Bạn cần thể hiện mình hiểu về tính nhất quán của dữ liệu.
- ACID Properties: Hãy sẵn sàng mô tả vắn tắt Atomicity, Consistency, Isolation, Durability.
- Isolation Levels: Hiểu cách các mức độ (như Read Committed, Repeatable Read) ngăn chặn các vấn đề như Dirty reads, Non-repeatable reads hay Phantom reads.
- Transaction Management: Biết cách sử dụng BEGIN...COMMIT/ROLLBACK để đảm bảo tính toàn vẹn dữ liệu khi thực hiện nhiều lệnh thao tác liên quan.
Viết SQL 'chạy được' thay vì 'SARGable'
Lỗi này rất phổ biến khi viết điều kiện WHERE. Một câu lệnh lọc dữ liệu trên một hàm (function) sẽ khiến database không thể sử dụng Index (Index scan thay vì Index seek).
Đây được gọi là các truy vấn không 'SARGable' (Search ARGumentable).
- Tránh dùng hàm trên cột: Thay vì dùng `WHERE YEAR(created_at) = 2023`, hãy lọc trực tiếp trên giá trị: `created_at >= '2023-01-01' AND created_at < '2024-01-01'`.
- Thứ tự điều kiện: Chú ý đến thứ tự các điều kiện trong các hệ quản trị CSDL cũ (tùy theo Optimizer).
- Execution Plan: Nếu được phép, hãy đề nghị phân tích Execution Plan để chứng minh bạn hiểu database đang chạy query đó như thế nào.
Ghi nhớ nhanh
- Luôn chỉ định rõ cột cần lấy (Explicit selection) thay vì dùng `SELECT *` để tối ưu tài nguyên.
- Hiểu bản chất của B-Tree Index và Cardinality, đừng chỉ thuộc lòng từ khóa.
- Ưu tiên `UNION ALL` trừ khi có yêu cầu nghiệp vụ bắt buộc phải loại bỏ dòng trùng lặp.
- Lưu ý các truy vấn SARGable để Database có thể tận dụng index hiệu quả nhất.
- Nắm vững các nguyên lý ACID và xử lý đồng thời (Concurrency control) để đảm bảo dữ liệu luôn nhất quán trong kiến trúc microservices.