12/08/2018, 16:14

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à InnoDB và MyISAM . Nhưng ta nên dùng InnoDB hay MyISAM ? Tại ...

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.

Bài liên quan

The FEDERATED Storage Engine in Mysql

Chào các bạn, Vừa qua trong dự án mình tham gia có gặp một yêu cầu là join 2 bảng ở hai server khác nhau, sau đó mình tìm hiểu thì biết là trong mysql có một kỷ thuật cho phép chúng ta làm điều đó là FEDERATED Storage Engine. FEDERATED Storage Engine cho phép chúng ta truy cập một database từ xa ...

Hoàng Hải Đăng viết 17:51 ngày 12/08/2018

Input & output in Ruby

Trong phần này chúng ta sẽ tìm hiểu về hệ thống nhập xuất trong Ruby. Khi chạy một chương trình thì chương trình có thể nhận các dòng dữ liệu đi vào, có thể là từ bàn phím, file hoặc từ chính một chương trình khác. Tương tự, chương trình cũng có thể xuất các dòng dữ liệu đi ra ngoài, thường là sẽ ...

Trịnh Tiến Mạnh viết 17:04 ngày 12/08/2018

How To Create a New User and Grant Permissions in MySQL

About MySQL MYSQL là một hệ quản trị cơ sở dữ liệu mã nguồn mở giúp cho người dùng lưu trữ, tổ chức và sau đó lấy dữ liệu. Nó có nhiều lựa chọn cung cấp cho người dùng để thao tao với bảng và cơ sở dữ liệu. Bài viết này hướng dẫn việc tạo user và cấp quyền trong MYSQL. How to Create a New ...

Bùi Văn Nam viết 16:21 ngày 12/08/2018

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à InnoDB và MyISAM . Nhưng ta nên dùng InnoDB hay MyISAM ? Tại ...

Bùi Văn Nam viết 16:14 ngày 12/08/2018

Generated (Virtual) columns in MySQL InnoDB

Generated columns là một tính năng mới của MySQL InnoDB phiên bản 5.7. Có hai loại Generated columns là Virtual (default) và Stored. Virtual có nghĩa là giá trị của column được tính toán khi thực hiện câu truy vấn. Storeed thì ngược lại, giá trị của column được tính toán khi record được ghi vào ...

Trịnh Tiến Mạnh viết 15:42 ngày 12/08/2018
0