10 câu hỏi có thể gặp khi phỏng vấn
Chọn theo kỹ năng và cấp của tin (SQL & Database). Gợi ý trả lời do Drama Công Ty biên soạn để bạn ôn nhanh, không phải đề của công ty.
01Index là gì, hoạt động thế nào? Có nên đánh index cho mọi cột không?SQL & Database · Junior
Gợi ý trả lời
Ôn thêm câu hỏi SQL & Database →Index là cấu trúc dữ liệu phụ (thường là B-Tree) giúp tìm dòng theo giá trị cột mà không phải quét cả bảng, đổi lại tốn dung lượng và làm chậm thao tác ghi.
- B-Tree hợp với so sánh
=,<,>,BETWEEN,ORDER BY,LIKE 'abc%'. - Mỗi
INSERT/UPDATE/DELETEphải cập nhật thêm mọi index liên quan. - Cột có độ chọn lọc thấp (vd.
gender,is_deleted) đánh index riêng thường ít tác dụng.
Không nên đánh index tràn lan: chỉ thêm cho cột hay xuất hiện trong
WHERE,JOIN,ORDER BYcủa các query quan trọng, rồi kiểm tra bằngEXPLAIN.Hay sai: bọc cột trong hàm, vd.
WHERE YEAR(created_at) = 2026hoặcLOWER(email) = ..., khiến index thường trên cột đó không được dùng. Hãy viết lại thành khoảng thời gian hoặc dùng index trên biểu thức.- B-Tree hợp với so sánh
02Transaction là gì? Giải thích ACID.SQL & Database · Junior
Gợi ý trả lời
Ôn thêm câu hỏi SQL & Database →Transaction là một nhóm thao tác được thực hiện như một đơn vị: hoặc tất cả thành công (
COMMIT), hoặc không có gì xảy ra (ROLLBACK).- Atomicity: không có trạng thái làm dở dang.
- Consistency: sau transaction dữ liệu vẫn thoả ràng buộc (khoá ngoại, unique, check).
- Isolation: các transaction chạy đồng thời không thấy dữ liệu dở dang của nhau, mức độ tuỳ isolation level.
- Durability: đã commit thì không mất dù server sập (nhờ write-ahead log / redo log).
BEGIN; UPDATE accounts SET balance = balance - 500 WHERE id = 1; UPDATE accounts SET balance = balance + 500 WHERE id = 2; COMMIT;Người phỏng vấn muốn nghe: một ví dụ thực tế như chuyển tiền hoặc trừ tồn kho, và bạn biết giữ transaction ngắn, không gọi API bên ngoài khi đang mở transaction.
03Composite index (index nhiều cột) hoạt động ra sao? Thứ tự cột có quan trọng không?SQL & Database
Gợi ý trả lời
Ôn thêm câu hỏi SQL & Database →Có. Composite index sắp xếp theo cột đầu, rồi đến cột thứ hai trong cùng giá trị cột đầu, v.v. Vì vậy nó chỉ dùng hiệu quả khi query dùng các cột từ trái sang (leftmost prefix).
Với
INDEX (status, created_at):WHERE status = 'paid' AND created_at > ...: dùng tốt.WHERE status = 'paid' ORDER BY created_at DESC: dùng cho cả lọc lẫn sắp xếp.WHERE created_at > ...(không có status): thường không dùng được.
Nguyên tắc chọn thứ tự: cột so sánh bằng (
=) đặt trước, cột so sánh khoảng hoặc sắp xếp đặt sau. Nếu index chứa đủ mọi cột query cần (covering index) thì DB không phải đọc lại bảng.Hay sai: tạo riêng index cho từng cột rồi nghĩ rằng chúng sẽ kết hợp hiệu quả như một composite index.
04Các isolation level là gì? Dirty read, non-repeatable read, phantom read khác nhau thế nào?SQL & Database
Gợi ý trả lời
Ôn thêm câu hỏi SQL & Database →Isolation level quyết định một transaction thấy được bao nhiêu thay đổi của transaction khác; mức càng cao càng an toàn nhưng càng dễ tranh chấp.
- Dirty read: đọc dữ liệu transaction khác chưa commit.
- Non-repeatable read: đọc lại cùng một dòng thấy giá trị đã đổi.
- Phantom read: chạy lại cùng điều kiện thấy thêm hoặc mất dòng.
Bốn mức chuẩn: Read Uncommitted, Read Committed, Repeatable Read, Serializable. Mặc định của PostgreSQL, SQL Server, Oracle là Read Committed; MySQL InnoDB là Repeatable Read.
Thực tế các DB dùng MVCC nên hành vi có khác lý thuyết: Repeatable Read của PostgreSQL dùng snapshot nên không gặp phantom, còn InnoDB dùng gap lock cho câu đọc có khoá.
Người phỏng vấn muốn nghe: bạn biết DB mình dùng mặc định ở mức nào và đã từng xử lý lost update, vd. bằng
SELECT ... FOR UPDATEhoặc optimistic locking.05Một API chạy chậm, nghi do query. Bạn điều tra và tối ưu thế nào?SQL & Database
Gợi ý trả lời
Ôn thêm câu hỏi SQL & Database →Đo trước rồi mới sửa: tìm đúng query chậm, đọc execution plan, rồi chỉnh index hoặc cách viết query.
- Bật slow query log (MySQL) hoặc
pg_stat_statements(PostgreSQL) để biết query nào tốn thời gian nhất. - Chạy
EXPLAIN(PostgreSQL nên dùngEXPLAIN (ANALYZE, BUFFERS)) xem có full scan, ước lượng số dòng lệch nhiều so với thực tế, sort trên đĩa không. - Sửa theo nguyên nhân: thêm hoặc đổi composite index, bỏ hàm bọc cột, chỉ
SELECTcột cần, phân trang bằng keyset thay choOFFSETlớn. - Kiểm tra phía ứng dụng: lỗi N+1 query, thiếu connection pool, lock chờ lâu.
- Cập nhật thống kê (
ANALYZE) nếu planner ước lượng sai.
Người phỏng vấn muốn nghe: quy trình có số liệu trước/sau, không phải đoán rồi thêm index bừa.
- Bật slow query log (MySQL) hoặc
06Chuẩn hoá (normalization) là gì? Khi nào nên denormalize?SQL & Database
Gợi ý trả lời
Ôn thêm câu hỏi SQL & Database →Chuẩn hoá là tách dữ liệu để mỗi thông tin chỉ lưu ở một chỗ, tránh dư thừa và sai lệch khi cập nhật.
- 1NF: mỗi ô một giá trị nguyên tử, không lưu danh sách trong một cột.
- 2NF: cột không khoá phụ thuộc vào toàn bộ khoá chính, không chỉ một phần.
- 3NF: cột không khoá không phụ thuộc bắc cầu qua cột không khoá khác.
Denormalize khi đọc nhiều hơn ghi rất nhiều và JOIN trở thành điểm nghẽn: lưu sẵn
comment_counttrong bảng bài viết, chépcustomer_namevào đơn hàng để giữ đúng tên tại thời điểm đặt, hoặc dựng bảng báo cáo riêng.Hay sai: denormalize mà không có cơ chế đồng bộ (trigger, job, event) nên số liệu lệch dần. Hãy nói rõ cái giá phải trả là logic ghi phức tạp hơn.
07Deadlock trong database xảy ra thế nào và xử lý ra sao?SQL & Database · Senior
Gợi ý trả lời
Ôn thêm câu hỏi SQL & Database →Deadlock là khi hai transaction giữ khoá mà bên kia cần và chờ nhau mãi. DB tự phát hiện, chọn một transaction làm nạn nhân và rollback nó.
Ví dụ: T1 khoá dòng A rồi muốn B, cùng lúc T2 khoá B rồi muốn A.
Cách giảm deadlock:
- Luôn khoá tài nguyên theo cùng một thứ tự (vd. sắp xếp theo
idtrước khi update nhiều dòng). - Giữ transaction ngắn, không chờ I/O bên ngoài khi đang giữ khoá.
- Có index phù hợp để câu
UPDATE/DELETEkhông khoá quá nhiều dòng. - Ứng dụng bắt lỗi deadlock và retry có giới hạn.
Khi điều tra: MySQL dùng
SHOW ENGINE INNODB STATUS, PostgreSQL xem log (deadlock được ghi kèm câu lệnh) vàpg_locks.Người phỏng vấn muốn nghe: bạn coi retry là bình thường nhưng vẫn tìm gốc rễ ở thứ tự khoá.
- Luôn khoá tài nguyên theo cùng một thứ tự (vd. sắp xếp theo
08Khi nào chọn NoSQL (MongoDB, Redis…) thay vì SQL? Trade-off là gì?SQL & Database · Senior
Gợi ý trả lời
Ôn thêm câu hỏi SQL & Database →Chọn theo mô hình truy cập dữ liệu, không theo xu hướng. SQL mạnh ở quan hệ, ràng buộc và transaction; NoSQL mạnh ở schema linh hoạt, mô hình dữ liệu đặc thù hoặc scale ngang dễ hơn.
- Document (MongoDB): dữ liệu dạng cây, đọc nguyên khối theo một khoá, schema thay đổi thường xuyên.
- Key-value (Redis): cache, session, rate limit, bộ đếm, hàng đợi nhỏ; dữ liệu chủ yếu nằm trong RAM.
- Wide-column, time-series, search engine: ghi khối lượng lớn, log, tìm kiếm full-text.
Trade-off: JOIN và transaction nhiều document hạn chế hoặc đắt hơn, ràng buộc dữ liệu chuyển sang tầng ứng dụng, và phải thiết kế theo query ngay từ đầu.
Người phỏng vấn muốn nghe: nhiều hệ thống dùng kết hợp, vd. PostgreSQL làm nguồn sự thật, Redis làm cache. PostgreSQL với
JSONBcũng đủ cho nhiều nhu cầu "schema linh hoạt".09Bảng có hàng trăm triệu dòng, query ngày càng chậm. Bạn dùng partitioning, sharding hay read replica?SQL & Database · Senior
Gợi ý trả lời
Ôn thêm câu hỏi SQL & Database →Mỗi kỹ thuật giải một vấn đề khác nhau, nên cần xác định điểm nghẽn là đọc, ghi hay kích thước dữ liệu.
- Read replica: giảm tải đọc. Phải chấp nhận replication lag; luồng vừa ghi xong đọc lại nên đọc từ primary.
- Partitioning (trong một DB): chia bảng theo khoảng thời gian hoặc theo key. Query có điều kiện trên partition key chỉ quét phần liên quan, xoá dữ liệu cũ bằng
DROP PARTITIONrất nhanh. - Sharding (nhiều DB): khi một máy không chịu nổi lượng ghi hoặc dung lượng. Đổi lại phải chọn shard key cẩn thận, query xuyên shard và transaction phân tán rất khó.
Thứ tự hợp lý: tối ưu query và index, archive dữ liệu cũ, thêm replica và cache, partition, cuối cùng mới shard.
Hay sai: chọn shard key gây hot spot, vd. theo ngày tạo khiến mọi lượt ghi dồn vào một shard.
10Vì sao bạn chọn ứng tuyển vào công ty chúng tôi?Câu hỏi hành vi & văn hoá
Gợi ý trả lời
Ôn thêm câu hỏi Câu hỏi hành vi & văn hoá →Câu này kiểm tra bạn có tìm hiểu không hay chỉ rải CV. Nối ba thứ: công ty, vị trí, và bạn.
- Tìm hiểu trước: sản phẩm, khách hàng, công nghệ, tin tức gần đây, đánh giá của nhân viên cũ và hiện tại.
- Chọn một hai điểm cụ thể bạn thật sự quan tâm: sản phẩm bạn từng dùng, bài toán kỹ thuật, quy mô người dùng, văn hoá làm việc.
- Nối với kinh nghiệm hoặc mục tiêu của bạn.
Câu mẫu: "Em có dùng ứng dụng của bên mình và thấy phần thanh toán rất mượt. Trong JD có nói team đang mở rộng hệ thống xử lý giao dịch, đúng mảng em đã làm hai năm. Em nghĩ mình đóng góp được ngay và cũng học được nhiều ở quy mô lớn hơn."
Hay sai: "Vì công ty lớn, lương tốt" hoặc khen chung chung áp vào công ty nào cũng được.
Bạn đã phỏng vấn ở Smartbit Technology?
Kể lại các vòng và câu hỏi đã gặp (ẩn danh) để người sau ôn đúng trọng tâm.
Chia sẻ kinh nghiệm phỏng vấn