MyISAM & InnoDB in MySQL

MySQL là Hệ quản trị cơ sở dữ liệu miễn phí được sử dụng phổ biến. Khi tạo 1 bảng trong MySQL sẽ có nhiều kiểu Storage Engine để bạn lựa chọn. Trong bài viết này, mình sẽ đề cập đến 2 kiểu lưu trữ bảng được sử dụng nhiều nhất là InnoDBMyISAM. Nhưng ta nên dùng InnoDB hay MyISAM? Tại sao như thế? Bài viết này sẽ giúp các bạn nắm được cách hoạt động của các Storage Engine này. Từ đó có thể biết được cách chọn loại phù hợp khi xây dựng ứng dụng của mình để hiệu suất và độ ổn định đạt được cao nhất.

1. MyISAM

Đây là một Storage Engine mặc định và được sử dụng phổ biến nhất. - Ưu điểm Engine duy nhất hỗ trợ Full Text Search lập chỉ mục toàn văn, cung cấp thuật toán tìm kiếm khá giống Google. Kiến trúc đơn giản nên có tốc độ truy suất (đọc và tìm kiếm) nhanh nhất trong các loại Storage Engine. - Nhược điểm MyISAM hoạt động theo cơ chế Table Level Locking, nên khi có hành động thực hiện (thêm/sửa/xóa) 1 bản ghi nào đó trong table thì table đó sẽ bị khóa lại, chờ tới khi hành động này được thực hiện xong thì hành động kia mới tiếp tục được thực hiện. Kiến trúc đơn giản, không ràng buộc nên loại Storage Engine này rất dễ bị crash, hỏng chỉ mục với những table có số lượng bản ghi lớn. - Chuyển đổi 1 table sang MyISAM

ALTER TABLE table_name ENGINE = MyISAM;

2. InnoDB

Đây là Storage Engine mới hơn có nhiều tính năng và ưu điểm vượt trội hơn so với MyISAM. - Ưu điểm Engine này kiểm tra tính toàn vẹn và ràng buộc dữ liệu rất cao, khó xảy ra tình trạng hỏng chỉ mục và crash table. Hoạt động theo cơ chế Row Level Locking, vì vậy trong lúc thực hiện các hành động (thêm/sửa/xóa) trên 1 bản ghi, thì các hoạt động ở bản ghi khác trên table vẫn diễn ra bình thường. Hỗ trợ Transaction giúp đảm bảo an toàn khi thực hiện một khối lệnh SQL đảm bảo nhất quán dữ liệu. - Nhược điểm Hoạt động cần nhiều RAM hơn, nhưng nếu so sánh với MyISAM trong trường hợp tần suất Insert/Update/Delete lớn thì có khi sẽ lớn hơn vì cơ chế Table Level Locking sẽ gây ra hàng đợi lớn, gây chậm quá trình xử lý. - Chuyển đổi một table sang InnoDB

ALTER TABLE table_name ENGINE = InnoDB;

Note: Để chuyển đổi Storage Engine từ MyISAM sang InnoDB, nếu trên field nào đánh chỉ mục Full Text Search thì các bạn cần phải xóa Index này đi mới có thể chuyển sang được.

3. So sánh MyISAM và InnoDB

MyISAM InnoDB
Hỗ trợ Table - Level Loking Hỗ trợ Row - Level Locking
Được thiết kế cho nhu cầu về tốc độ (speed) Được thiết kế để đạt hiệu suất tối đa khi xử lý lượng dữ liệu lớn
Không hỗ trợ Foreign keys vì thế nên chúng ta gọi MySQL với MyISAM là DBMS Hỗ trợ Foreign keys vì thế nên chúng ta gọi MySQL với InnoDB là RDBMS
Lưu trữ tables, data, indexes của nó trong không gian đĩabằng cách sử dụng 3 file riêng biệt (table_name.FRM, table_name.MYD, table_name.MYI) Lưu trữ tables, indexes của nó trong 1 không gian bảng
Không hỗ trợ Transaction Có hỗ trợ Transaction
Hỗ trợ Full Text Search Từ version 5.5 trở về sau, InnoDB có hỗ trợ Full Text Search

=> Tóm lại:

  • Với 1 ứng dụng dạng Blog, News, ... thì nên dùng MyISAM để cho hiệu suất tốt.
  • Với ứng dụng dạng Forum, Socials network thì nên sử dụng InnoDB để tốc độ Insert/Update dữ liệu cao nhất. Bài viết đã giới thiệu về 2 loại Storage Engine trong MySQL, tùy vào ứng dụng mà bạn có thể chọn InnoDB hay MyISAM cho phù hợp.

Tài liệu tham khảo:

https://hostingaz.vn/1642-myisam-innodb-memory-hieu-suat-vps-server-tot-nhat.html https://stackoverflow.com/questions/12614541/whats-the-difference-between-myisam-and-innodb