Truy vấn SQL cơ bản
Cho bảng students gồm các cột: name, chinese, math, english. Tìm tên học sinh có điểm trung bình lớn hơn 60.
SELECT name FROM students WHERE (chinese + math + english) / 3.0 > 60;
Cho bảng grades gồm: student_name, class_id, score. Liệt kê các lớp có điểm trung bình trên 60.
SELECT class_id
FROM grades
GROUP BY class_id
HAVING AVG(score) > 60;
Cho bảng people gồm: id, full_name, age. Tìm độ tuổi xuất hiện nhiều nhất.
SELECT age, COUNT(*) AS occurrence
FROM people
GROUP BY age
ORDER BY occurrence DESC
LIMIT 1;
Cho bảng exam_results gồm: student_name, subject, mark. Truy vấn học sinh có điểm trung bình các môn lớn hơn 60.
SELECT student_name, AVG(mark) AS avg_score
FROM exam_results
GROUP BY student_name
HAVING AVG(mark) > 60;
Chỉ mục trong MySQL
Các loại chỉ mục phổ biến:
- B-Tree Index: Dùng cho tìm kiếm chính xác, khoảng giá trị và sắp xếp. Phổ biến nhất.
- Hash Index: Tối ưu cho phép so sánh bằng, không hỗ trợ tìm kiếm khoảng hay LIKE.
- Full-text Index: Dành riêng cho tìm kiếm văn bản, hỗ trợ từ khóa và trọng số.
- Spatial Index: Dùng để truy vấn dữ liệu địa lý như tọa độ, vùng phủ.
- Prefix Index: Chỉ lập chỉ mục cho một phần đầu của cột, tiết kiệm không gian nhưng giảm hiệu năng.
Nguyên lý hoạt động:
Chỉ mục MySQL thường dựa trên cấu trúc B+ Tree — dạng cây cân bằng đa chiều giúp giảm độ phức tạp truy vấn xuống O(log N). Khi truy vấn, engine sẽ duyệt cây để định vị nhanh bản ghi thay vì quét toàn bảng.
Vì sao không nên quá nhiều hoặc quá ít chỉ mục?
- Quá nhiều: Tốn bộ nhớ, làm chậm thao tác INSERT/UPDATE/DELETE do phải cập nhật đồng thời nhiều chỉ mục.
- Quá ít: Buộc hệ thống phải quét toàn bảng (full table scan), gây chậm truy vấn và tăng tải CPU/RAM.
Engine lưu trữ
- InnoDB: Hỗ trợ transaction, row-level locking, phù hợp hệ thống cần ghi nhiều. Dữ liệu lưu cùng node lá → tối ưu cho truy vấn theo khóa chính.
- MyISAM: Không hỗ trợ transaction, lock toàn bảng, nhưng đọc nhanh hơn InnoDB trong một số trường hợp đơn giản.
- Memory: Lưu dữ liệu trong RAM, tốc độ cao nhưng mất dữ liệu khi server restart.
Tối ưu hiệu năng cơ sở dữ liệu
- Phân tích và tối ưu câu truy vấn bằng
EXPLAIN. - Thiết kế schema hợp lý: chọn kiểu dữ liệu phù hợp, tránh dư thừa.
- Sử dụng cache ứng dụng hoặc query cache để giảm tải DB.
- Cấu hình phần cứng: tăng RAM, dùng SSD, tối ưu I/O.
- Giám sát định kỳ: slow query log, CPU usage, disk latency.
- Kiểm soát concurrency: chọn isolation level phù hợp, tránh deadlock.
Giao dịch (Transaction)
ACID là gì?
- Atomicity: Giao dịch là đơn vị nguyên tử — hoặc thực hiện hết, hoặc không làm gì.
- Consistency: Luôn đảm bảo trạng thái hợp lệ của dữ liệu trước/sau giao dịch.
- Isolation: Các giao dịch chạy song song không ảnh hưởng lẫn nhau.
- Durability: Sau khi commit, kết quả được lưu vĩnh viễn kể cả khi hệ thống sập.
Giao dịch phân tán là giao dịch trải dài trên nhiều database hoặc service khác nhau. Thường dùng giao thức 2PC (Two-Phase Commit) hoặc Saga Pattern để đảm bảo tính nhất quán. Thách thức chính bao gồm: độ trễ mạng, xử lý rollback phân tán, và đồng bộ hóa trạng thái.
Đảm bảo nhất quán trong hệ thống phân tán:
- Dùng giao thức đồng thuận như Raft hoặc Paxos.
- Triển khai replication (primary-replica) với cơ chế failover.
- Đồng bộ hóa thời gian giữa các node (NTP).
- Xử lý xung đột ghi bằng version vector hoặc last-write-wins.