MySQL là một hệ quản trị cơ sở dữ liệu quan hệ mã nguồn mở miễn phí, rất phổ biến trong cộng đồng phát triển phần mềm tại Việt Nam. Bài viết này sẽ tổng hợp các kiến thức quan trọng về MySQL, đặc biệt là về các loại Storage Engine khác nhau.
Một trong những đặc điểm quan trọng nhất của MySQL là kiến trúc plugin-based cho phép sử dụng nhiều loại Storage Engine khác nhau như MyISAM, InnoDB, BDB, MEMORY, MERGE. Điều này cho phép nhà phát triển lựa chọn loại Storage Engine phù hợp với nhu cầu ứng dụng, giúp tối ưu hóa hiệu suất.
Kiểm tra Storage Engine mặc định hiện tại:
show VARIABLES like "%ENGINE%"
Xem các Storage Engine được hỗ trợ:
show ENGINES
Thay đổi Storage Engine mặc định:
Thêm dòng default-storage-engine=INNODB vào phần [mysqld] trong file cấu hình my.cnf.
Dưới đây là phân tích chi tiết về các loại Storage Engine phổ biến trong MySQL:
Bình luận: Mỗi Storage Engine có đặc điểm và ứng dụng riêng
Một. Storage Engine MyISAM
1. MyISAM là Storage Engine mặc định của MySQL
2. Không hỗ trợ transaction
3. Không hỗ trợ khóa ngoại
Ưu điểm: Tốc độ truy vấn nhanh, phù hợp với các ứng dụng không yêu cầu tính toàn vẹn giao dịch hoặc chủ yếu là các thao tác insert và select.
4. MyISAM lưu trữ dữ liệu trên đĩa dưới dạng 3 file riêng biệt:
- .frm (lưu định nghĩa bảng)
- .MYD (MYData, lưu dữ liệu)
- .MYI (MYIndex, lưu chỉ mục)
File dữ liệu và file chỉ mục có thể được đặt ở các thư mục khác nhau để phân bổ IO đồng đều và tăng tốc độ truy vấn.
Đường dẫn lưu trữ file dữ liệu và chỉ mục có thể được chỉ định khi tạo bảng bằng các câu lệnh data directory và index directory.
5. MyISAM hỗ trợ 3 định dạng lưu trữ khác nhau:
- Bảng tĩnh (độ dài cố định)
- Bảng động
- Bảng nén
Đối với bảng tĩnh (mặc định), khi lưu trữ dữ liệu có khoảng trắng ở đầu và cuối (ví dụ: " ab "), MySQL sẽ tự động loại bỏ khoảng trắng. Điều này có thể gây mất mát dữ liệu. Ưu điểm của bảng tĩnh là tốc độ lưu trữ nhanh, dễ cache và phục hồi nhanh sau lỗi.
Hai. Storage Engine InnoDB
InnoDB hỗ trợ transaction, nhưng so với MyISAM, tốc độ insert có thể chậm hơn và chiếm nhiều không gian đĩa hơn để lưu trữ dữ liệu và chỉ mục.
1. Hỗ trợ cột tự tăng (auto-increment)
Cột tự tăng trong InnoDB phải là một chỉ mục. Nếu là chỉ mục kết hợp, cột tự tăng phải là cột đầu tiên. Có thể sử dụng:
alter table ten_bang auto_increment = n
để thiết lập giá trị khởi đầu cho cột tự tăng. Giá trị mặc định bắt đầu từ 1. Lưu ý: giá trị này được lưu trong bộ nhớ, nếu database bị crash trước khi sử dụng giá trị này, giá trị sẽ bị mất và cần thiết lập lại sau khi phục hồi.
2. InnoDB hỗ trợ khóa ngoại:
Đây là đặc điểm độc nhất của InnoDB trong các Storage Engine của MySQL. Khi tạo khóa ngoại, bảng cha phải có chỉ mục tương ứng, và bảng con cũng sẽ tự động tạo chỉ mục khi thêm khóa ngoại.
Khi thao tác với các bảng có quan hệ khóa ngoại, cần cẩn thận vì thao tác sai có thể dẫn đến mất dữ liệu.
Nếu một bảng có các bảng khác tham chiếu qua khóa ngoại, các chỉ mục hoặc khóa chính của bảng đó không thể bị xóa.
Tắt kiểm tra ràng buộc khóa ngoại:
set foreign_key_checks = 0
Bật kiểm tra ràng buộc khóa ngoại:
set foreign_key_checks = 1
Xem thông tin khóa ngoại:
show create table hoặc show table status
Ba. Storage Engine MEMORY
Storage Engine này sử dụng bộ nhớ RAM để tạo bảng, do đó tốc độ truy vấn cực nhanh. Tuy nhiên, dữ liệu không an toàn vì sẽ mất khi dịch vụ bị tắt. Cần lưu ý về kích thước dữ liệu vì nếu không sử dụng nữa cần xóa để giải phóng bộ nhớ.
Bốn. Tóm tắt ứng dụng:
MyISAM:
Phù hợp với các ứng dụng có nhiều thao tác select và insert, không yêu cầu cao về tính toàn vẹn giao dịch và đồng thời.
InnoDB:
Phù hợp với các ứng dụng có nhiều thao tác update và delete, yêu cầu tính toàn vẹn giao dịch và tính nhất quán dữ liệu trong môi trường đồng thời.
MEMORY:
Dữ liệu lưu trong bộ nhớ, phù hợp khi yêu cầu tốc độ truy vấn cao, nhưng cần chấp nhận rủi ro mất dữ liệu.