MyISAM & InnoDB in MySQL
Bài đăng này đã không được cập nhật trong 2 năm
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à InnoDB và MyISAM. 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
All rights reserved