Xin chào các bạn,
Khi tìm hiểu về SQL, câu lệnh truy vấn đầu tiên mà bạn gặp phải chính là lệnh SELECT. Ví dụ, lệnh SQL như sau:
sql
SELECT * FROM Member WHERE CardNo = 1;
Nhưng bạn đã bao giờ tự hỏi rằng, quá trình thực thi một câu lệnh SELECT trong MySQL diễn ra như thế nào chưa? Để trả lời câu hỏi này, chúng ta cần phân tích cấu trúc và kiến trúc bên trong của MySQL. Hãy cùng tìm hiểu chi tiết hơn về từng thành phần trong MySQL và vai trò của chúng trong quá trình thực thi.
1. Kiến Trúc Tổng Quan của MySQL
Kiến trúc của MySQL được chia thành hai tầng chính: Server Layer và Storage Engine Layer.
1.1 Server Layer
Server Layer đóng vai trò tạo kết nối, phân tích và thực thi các câu lệnh SQL. Các module cốt lõi của MySQL, bao gồm Connection Manager, Query Cache, Parser, Preprocessor, Optimizer, và Executor được triển khai ở tầng này. Ngoài ra, các hàm tích hợp (built-in functions) và các chức năng khác như stored procedures, triggers, views cũng nằm trong Server Layer.
1.2 Storage Engine Layer
Storage Engine Layer đảm nhiệm việc lưu trữ và truy xuất dữ liệu. MySQL hỗ trợ nhiều storage engine khác nhau như InnoDB, MyISAM, Memory,... Mỗi loại có những đặc tính và hiệu suất riêng, phục vụ cho từng trường hợp cụ thể. Hiện tại, InnoDB là storage engine phổ biến và mặc định kể từ MySQL 5.5.
Để đơn giản hóa, trong bài viết này, chúng ta chỉ tập trung vào các thành phần liên quan đến câu lệnh SELECT.
2. Bước 1: Tạo Kết Nối (Connection)
Đầu tiên, bạn cần kết nối với dịch vụ MySQL trên hệ điều hành Linux:
bash
mysql -h $ip -u $user -p
Quá trình kết nối bao gồm ba bước bắt tay TCP. Nếu thông tin xác thực (username và password) thành công, Connection Manager sẽ lưu lại quyền truy cập của người dùng. Mọi thao tác tiếp theo của người dùng trong connection này sẽ được kiểm tra theo các quyền đã lưu.
2.1 Kiểm Tra Các Client Kết Nối
Bạn có thể sử dụng lệnh
sql
SHOW PROCESSLIST;
để xem danh sách các client đang kết nối.
2.2 Giới Hạn Kết Nối
MySQL giới hạn số lượng kết nối đồng thời với giá trị mặc định là 151. Nếu vượt quá giới hạn này, hệ thống sẽ từ chối yêu cầu kết nối và thông báo lỗi "Too many connections".
3. Module Query Cache
Sau khi tạo kết nối, nếu câu lệnh là SELECT, MySQL sẽ kiểm tra module Query Cache để tìm dữ liệu trước đó. Query Cache lưu trữ dữ liệu theo cách key-value. Key chính là câu lệnh SQL và value là kết quả trả về từ câu lệnh đó.
=> Lưu ý: Từ MySQL 8.0, module Query Cache đã bị loại bỏ do tỷ lệ cache hit thấp ở các bảng có cập nhật thường xuyên.
4. Bước 2: Phân Tích Cú Pháp SQL
Trước khi thực thi, MySQL sẽ phân tích cú pháp câu lệnh SQL qua module Parser. Phần này thực hiện hai nhiệm vụ chính:
- Lexical Scanner xác định các từ khóa trong câu lệnh SQL, tạo ra các token.
- Grammatical Checker kiểm tra cú pháp và tạo ra Parse Tree để lưu trữ thông tin cần thiết cho các module kế tiếp.
Nếu câu lệnh có lỗi cú pháp, Parser sẽ thông báo lỗi.
5. Bước 3: Optimizer
Sau Parser, câu lệnh SQL sẽ được gửi đến Optimizer để xác định chiến lược thực thi
5.1 Tiền Xử Lý
Optimizer sẽ kiểm tra sự tồn tại của các bảng và trường trong câu lệnh, đồng thời chuyển đổi từ dấu *
thành tất cả các cột tương ứng.
5.2 Tối Ưu Hóa
Optimizer đánh giá các chiến lược thực thi để chọn ra phương án có chi phí thấp nhất cho truy vấn SQL.
6. Bước 4: Query Executor
Cuối cùng, Query Executor sẽ thực thi câu lệnh theo chiến lược đã được tối ưu hóa. Quá trình này bao gồm việc tương tác với storage engine và thực thi các lệnh theo từng loại index mà Optimizer chọn.
6.1 Ví dụ
Giả sử ta có câu truy vấn:
sql
SELECT * FROM Member WHERE CardNo = 'M0001';
Với CardNo là khóa chính, Executor sẽ gọi API của Storage Engine (InnoDB) để lấy bản ghi và trả về kết quả cho client.
7. Tổng Kết
- Connection Manager: Thiết lập và quản lý kết nối, xác thực người dùng.
- Query Cache: Đã loại bỏ trong MySQL 8.0.
- Parser: Phân tích cú pháp và tạo Parse Tree.
- Optimizer: Kiểm tra sự tồn tại của bảng/ trường và chọn kế hoạch thực thi tối ưu.
- Executor: Thực hiện truy vấn và trả kết quả về cho client.
Hy vọng bài viết này sẽ giúp các bạn hiểu rõ hơn về quá trình thực thi câu lệnh SELECT trong MySQL và cấu trúc hoạt động của nó. Cảm ơn các bạn đã theo dõi. Nếu cảm thấy bài viết hữu ích, hãy chia sẻ để nội dung đến được nhiều người hơn nhé! 🙏
8. Tài Liệu Tham Khảo
- Apache ShardingSphere Documentation
- Sách High Performance MySQL - Baron Schwartz, Peter Zaitsev, và Vadim Tkachenko
- Sách Understanding MySQL Internals (2009) - Sasha Pachev
🧑💻 90+ Ronin Engineers: RoninHub
📚️ System Design VN: Nhóm Facebook
source: viblo