MySQL là hệ thống quản trị cơ sở dữ liệu quan hệ (RDBMS) có kiến trúc phân tầng rõ ràng. Quá trình xử lý một câu lệnh SQL không chỉ đơn thuần là đọc và trả kết quả — mà là chuỗi các bước liên tiếp giữa các thành phần lõi của hệ thống.
Lớp Kết Nối (Client Layer)
Khi ứng dụng gửi yêu cầu đến MySQL, một tiến trình riêng biệt được khởi tạo tại phía client (ví dụ: mysql.exe trên Windows hoặc mysql trên Linux). Mỗi kết nối tương ứng với một luồng (thread) bên trong máy chủ, và có thể được theo dõi qua công cụ hệ thống:
$ netstat -tuln | grep :3306
tcp6 0 0 *:3306 *:* LISTEN 18456/mysqld
$ ps -p 148 -o pid,comm,args
PID COMMAND COMMAND
148 mysql mysql -u root -p
Mỗi lần mở thêm một phiên kết nối từ client sẽ sinh ra một tiến trình mới, nhưng tất cả đều chia sẻ cùng một tiến trình mysqld ở phía server — điều này minh họa rõ mô hình kiến trúc client-server chuẩn.
Lớp Máy Chủ (Server Layer)
Đây là nơi diễn ra toàn bộ logic xử lý truy vấn, bao gồm các thành phần chính sau:
Bộ kết nối (Connection Handler)
Sau khi xác thực tên người dùng và mật khẩu, MySQL cấp cho mỗi kết nối một session ID duy nhất. Thông tin các kết nối hiện hành có thể xem bằng:
SELECT id, user, host, db, command, time, state, info
FROM information_schema.processlist;
Các kết nối không hoạt động sẽ ở trạng thái Sleep, và bị đóng tự động sau khoảng thời gian do tham số wait_timeout quy định (mặc định là 28800 giây = 8 giờ).
Bộ đệm truy vấn (Query Cache — Đã loại bỏ từ MySQL 8.0)
Ở các phiên bản trước 8.0, MySQL kiểm tra bộ đệm trước khi phân tích câu truy vấn. Nếu một câu SELECT hoàn toàn giống đã từng được thực thi và chưa bị vô hiệu hóa do cập nhật dữ liệu, kết quả sẽ được trả ngay lập tức. Tuy nhiên, vì tính không ổn định trong môi trường write-heavy, chức năng này đã bị gỡ bỏ hoàn toàn trong MySQL 8.0:
SHOW VARIABLES LIKE 'query_cache_type'; -- Trả về 'OFF' hoặc lỗi nếu không tồn tại
Bộ phân tích (Parser)
Giai đoạn đầu tiên của xử lý truy vấn là phân tích cú pháp, gồm hai bước:
- Từ vựng (Lexical analysis): Tách chuỗi SQL thành các token — ví dụ:
SELECT,student,id,=,1. - Cú pháp (Syntax analysis): Kiểm tra thứ tự và cấu trúc các token có tuân thủ ngữ pháp MySQL hay không. Nếu sai (ví dụ: thiếu dấu chấm phẩy hoặc sai từ khóa), lỗi sẽ phát sinh ngay tại đây.
Bộ tối ưu hóa (Optimizer)
Sau khi câu truy vấn được xác nhận hợp lệ, bộ tối ưu hóa quyết định cách thực thi hiệu quả nhất: chọn index nào, thứ tự join bảng ra sao, có nên sử dụng temporary table hay không… Kết quả là một execution plan được sinh ra, có thể xem bằng:
EXPLAIN SELECT * FROM student WHERE id = 1;
Bộ thực thi (Execution Engine)
Đây là thành phần cuối cùng chịu trách nhiệm gọi tới storage engine để truy xuất dữ liệu thực tế. Trước khi thực thi, hệ thống vẫn kiểm tra lại quyền truy cập (ví dụ: người dùng có quyền SELECT trên bảng student hay không). Nếu đủ quyền, bộ thực thi sẽ lặp qua từng hàng phù hợp và xây dựng tập kết quả để trả về client.
Lớp Lưu Trữ (Storage Engine Layer)
MySQL tách biệt hoàn toàn giữa logic xử lý (server layer) và cơ chế lưu trữ dữ liệu (storage engine layer). Các engine phổ biến bao gồm:
- InnoDB: Mặc định từ phiên bản 5.5.5, hỗ trợ transaction, lock mức dòng, và ràng buộc khóa ngoại.
- MyISAM: Không hỗ trợ transaction, lock mức bảng, phù hợp cho read-heavy.
- MEMORY: Dữ liệu nằm hoàn toàn trong RAM, tốc độ cao nhưng mất dữ liệu khi tắt máy chủ.
Danh sách các engine khả dụng có thể truy vấn bằng:
SELECT engine, support, comment, transactions
FROM information_schema.engines
WHERE support != 'NO';
Khi tạo bảng, bạn có thể chỉ định engine rõ ràng:
CREATE TABLE enrollment (
enrollment_id BIGINT PRIMARY KEY AUTO_INCREMENT,
student_code CHAR(10) NOT NULL,
course_code VARCHAR(12) NOT NULL,
enroll_date DATE DEFAULT (CURRENT_DATE)
) ENGINE = InnoDB
CHARSET = utf8mb4
ROW_FORMAT = COMPACT;