Hiểu về kiến trúc của MySQL, cách MySQL thực thi câu query, cũng như cách hệ quản trị cơ sở dữ liệu này tối ưu hoá câu query sẽ giúp ích nhiều trong việc sử dụng hiệu quả MySQL, cũng như thực hiện MySQL performance tuning.
Bài viết này giới thiệu sơ lược về kiến trúc của MySQL.
Kiến trúc MySQL
MySQL Server chia thành 3 layer như hình 1, bao gồm: Utility Layer, SQL Layer và Storage Engine Layer.
Utility Layer
Utility Layer, là nơi xử lý những phần liên quan đến việc tạo kết nối giữa Client với MySQL Server. Connections pool: cung cấp những dịch vụ về xác thực tài khoản, bảo mật, xử lý kết nối.
Khi một câu query được Client gửi tới Server, Utility Layer sẽ tiếp nhận và xử lý việc tạo kết nối. Tiếp theo, Parser sẽ thực hiện việc phân tích cú pháp và đánh giá câu query để tạo ra parser tree. Dưới đây là ví dụ cho Parser một câu query đơn giản:
Sau quá trình Parser nếu có lỗi xảy ra, MySQL sẽ cho kết thúc và báo lỗi trả về cho Client. Ngược lại, thực hiện check permissions: kiểm tra quyền truy cập vào cơ sở dữ liệu, nếu có quyền sẽ tiếp tục xử lý tại SQL layer.
SQL layer
Sau khi tiếp nhận parser tree từ Utility layer, rewriter thực hiện việc rewrite parser tree nếu cần thiết. Như ví dụ hình 2, View "users" được lấy từ bảng nào, sẽ được thực hiện rewrite ngay tại bước này.
Tiếp theo, optimizer thực hiện việc tối ưu hoá. MySQL sẽ thực hiện việc tính toán để đưa ra chi phí thực thi ước lượng (thời gian thực hiện) cho các phương án (plan) khác nhau có thể có, đối với từng step của parser tree.
Sau khi tính toán tối ưu cho toàn bộ parser tree, MySQL đưa ra Execution plan và thực hiện bởi Executor.
Sử dụng EXPLAIN ANALYZE trong MySQL sẽ giúp chúng ta xem chi tiết các thông tin về các plan, thời gian thực thi, các dữ liệu.
Storage Engine Layer
Storage Engine, bản chất là cách MySQL lưu trữ dữ liệu trên đĩa cứng.
MySQL cho phép chúng ta lựa chọn các Storage engines khác nhau: InnoDB (default), MyISAM, v.v.
Các Storage Engine này có ưu và nhược điểm khác nhau. Tùy vào đặc điểm của dữ liệu mà chúng ta sẽ lựa chọn Storage Engine phù hợp.
Khi Executor thực thi thì Query Execution Engine sẽ tương tác với Storage Engine thông qua các API, để lấy dữ liệu và trả kết quả cho câu query.
Kết
Hi vọng qua bài viết này, mọi người nắm được quá trình MySQL thực thi một câu query. Điều này sẽ giúp ích khi chúng ta cố gắng tối ưu hoá các câu SQL.
Để tìm hiểu thêm về tối ưu câu query, hẹn các bạn ở các bài viết tiếp theo của mình.
Tài liệu tham khảo
https://www.udemy.com/course/mysql-high-performance-tuning-guide/