Bộ lưu trữ trong MySQL
Bộ lưu trữ (storage engine) là thành phần cốt lõi của MySQL, chịu trách nhiệm xử lý các thao tác SQL cho từng loại bảng. Mỗi bộ lưu trữ cung cấp cơ chế lưu trữ, kỹ thuật lập chỉ mục, mức độ khóa khác nhau, cùng với các tính năng đặc thù. Việc lựa chọn bộ lưu trữ phù hợp giúp tối ưu hiệu suất hệ thống.
Cơ chế trình điều khiển thay thế của MySQL cho phép người dùng tự do chọn bộ lưu trữ cho từng bảng riêng lẻ, đáp ứng nhu cầu cụ thể về hiệu năng và tính năng.
Kiểm tra bộ lưu trữ
-- Liệt kê các engine hỗ trợ
SHOW ENGINES;
-- Xác định engine mặc định
SHOW VARIABLES LIKE 'default_storage_engine';
-- Kiểm tra engine đang được sử dụng bởi bảng cụ thể
SHOW CREATE TABLE tenbang;
-- Truy vấn trạng thái bảng
SHOW TABLE STATUS LIKE 'tenbang';
SHOW TABLE STATUS FROM databasename WHERE name = 'tenbang';
Cấu hình bộ lưu trữ
-- Tạo bảng với engine cụ thể
CREATE TABLE bang1 (id INT) ENGINE = InnoDB;
CREATE TABLE bang2 (id INT) ENGINE = CSV;
CREATE TABLE bang3 (id INT) ENGINE = MEMORY;
-- Thay đổi engine cho bảng hiện có
ALTER TABLE bang1 ENGINE = InnoDB;
-- Cấu hình engine mặc định (có thể thiết lập trong my.cnf)
SET GLOBAL default_storage_engine = NDBCLUSTER;
Khi tạo hoặc thay đổi bảng không thể sử dụng engine yêu cầu, MySQL sẽ cảnh báo. Người dùng có thể bật chế độ NO_ENGINE_SUBSTITUTION để chuyển cảnh báo thành lỗi, tránh hành vi không mong muốn.
So sánh các bộ lưu trữ phổ biến
Các engine thường gặp bao gồm InnoDB, MyISAM, Memory và NDB:
- InnoDB: Engine mặc định hiện đại, hỗ trợ giao dịch, khóa hàng và khóa ngoại
- MyISAM: Hiệu năng cao với đọc dữ liệu, nhưng thiếu tính toàn vẹn dữ liệu
- Memory: Lưu trữ dữ liệu tạm thời trong RAM
- NDB: Phân tán dữ liệu trên nhiều nút
Cấu trúc tệp tin
Mỗi bảng trong MySQL đều có tệp .frm chứa metadata, độc lập với engine. Các engine khác nhau có cách lưu trữ dữ liệu và chỉ mục riêng:
- MyISAM:
.frm: Định nghĩa cấu trúc bảng.MYD: Dữ liệu bảng.MYI: Chỉ mục bảng
- InnoDB:
.frm: Metadata.ibdhoặc.ibdata:.ibd: Không gian bảng riêng biệt.ibdata: Không gian chia sẻ