Các loại storage engine trong MySQL

362

I. Storage engine trong MySQL là gì

Chúng ta đều biết rằng MySQL tổ chức dữ liệu dưới dạng các bảng, cột và hàng. Nhưng bạn có bao giờ thắc mắc về cách mà MySQL lưu trữ dữ liệu trên máy tính không (trên ổ cứng). Thực tế, MySQL có vài kiểu lưu trữ dữ liệu khác nhau, và người ta gọi chung các kiểu lưu trữ này là Storage engine.

Storage engine là một thuộc tính của table, không phải thuộc tính của database, của dòng hay cột. Tức bạn sẽ có quyền lựa chọn storage engine trong lúc tạo mới một table.

II. Các loại storage engine

2.1. MyISAM

Trước phiên bản MySQL 5.5, MyISAM là dạng storage engine mặc nếu trong lúc tạo table bạn không chỉ rõ. Nhưng từ phiên bản 5.5 trở đi, storage engine mặc định là InnoDB.

MyISAM được thiết kế để phù hợp với những table có thao tác đọc (select) nhiều hơn các thao tác thêm-sửa-xóa, vì:

  • MyISAM sử dụng cơ chế table-level locking, nghĩa là khi có một thao tác thêm-sửa-xóa dữ liệu thì toàn bộ table đó sẽ bị khóa lại cho tới khi thực hiện xong thì mới có thể tiếp tục thực hiện hành động thêm-sửa-xóa khác.
  • MyISAM là storage engine có tốc độ đọc (select dữ liệu) nhanh nhất do có cấu trúc đơn giản.
  • MyISAM hỗ trợ index full-text, cho phép tìm kiếm full-text (nhưng giờ InnoDB cũng hỗ trợ).
  • MyISAM hỗ trợ nén dữ liệu giúp tăng tốc độ đọc, nhưng dữ liệu sau khi nén không thể cập nhật được.

Một số đặc điểm khác của MyISAM:

  • Không hỗ trợ transaction.
  • MyISAM có thể lưu trữ dữ liệu tối đa lên tới 256TB.
  • Không hỗ trợ ràng buộc với các bảng khác (khóa ngoại).
  • Hỗ trợ đánh index (chỉ mục).

Chi tiết về dạng storage này bạn có thể xem ở đây:

2.2. InnoDB

InnoDB là storage engine mặc định (tính tới thời điểm MySQL 8.0) khi bạn tạo một table mà không chỉ rõ storage engine. Đây cũng là dạng storage engine cân bằng giữa các yếu tố về hiệu năng và độ tin cậy. Cụ thể:

  • InnoDB sử dụng cơ chế row-level locking, tức là khi có hành động thêm-sửa-xóa lên một bản ghi thì chỉ có bản ghi đó bị khóa lại, các bản ghi khác vẫn thực hiện thêm-sửa-xóa bình thường.
  • InnoDB có thể chứa tối đa 64TB dữ liệu.
  • Hỗ trợ transaction.
  • Hỗ trợ ràng buộc với các bảng khác (khóa ngoại).
  • Hỗ trợ đánh index (chỉ mục).
  • Hỗ trợ index full-text, cho phép tìm kiếm full-text.

Hiện tại trên tài liệu của MySQL 8.0, cũng ưu ái khi giành riêng một mục lớn chỉ để nói về InnoDB, còn các storage engine khác được nhóm vào mục “Các storage engine thay thế khác”. Đưa ra như vậy để bạn thấy rằng InnoDB là storage engine đáng chú ý và được sử dụng nhiều nhất.

Chi tiết về dạng storage engine này bạn có thể xem ở đây.

2.3 Memory engine

Memory engine là dạng storage mà toàn bộ dữ liệu sẽ được lưu trên memory (RAM). Do được lưu trên memory, nên dữ liệu trong bảng này rất dễ bị “tổn thương” (hoặc biến mất) khi gặp các vấn đề như bị crash ứng dụng, lỗi phần cứng, server reset, hay… mất điện. Vì thế dạng storage engine chỉ nên được sử dụng khi một bảng “tạm”, hoặc cache kết quả truy vấn từ một bảng khác.

Ưu điểm duy nhất của của storage engine này là do tốc độ truy xuất cao.

Chi tiết về dạng storage engine này bạn có thể xem ở đây.

III. Lựa chọn storage engine nào?

Mặc dù được chia làm vài ba loại storage engine (3 cái trên là 3 cái tiêu biểu), nhưng trong thực tế InnoDB gần như là storage engine duy nhất được sử dụng ở thời điểm hiện tại. Do nó là engine cân bằng giữa mọi yếu tố. Mặt khác, nó cũng là engine mà MySQL thể hiện tốt nhất, bởi:

  • MyISAM nổi bật nhất với khả năng lưu trữ tới 256TB, nhưng thực tế chẳng ai để table của mình lớn tới vậy cả.
  • MyISAM tối ưu cho việc read-only, nhưng nếu thật sự cần read-only thì mình có nhiều phương pháp chứ không nhất thiết phải dùng tới database.
  • Memory engine là giải pháp “lưu tạm”, cũng tương tự như MyISAM để lưu tạm chúng ta cũng có nhiều phương pháp thay thế.

Vậy là bạn biết nên chọn storage engine nào cho table của bạn rồi chứ?

VI. Bạn nên làm gì sau khi đọc bài viết này?

Kiểm tra storage engine của table

Nếu bạn muốn kiểm tra table của mình đang sử dụng loại storage engine nào, thì chỉ cần chạy lệnh sau:

SHOW CREATE TABLE table_name;

Mình tin là bạn sẽ biết phải chạy câu lệnh trên ở đâu.

Sau khi chạy xong, hãy để ý tới dòng cuối cùng, đoạn ENGINE=xxx, thì xxx chính là storage engine của table đó.

Thay đổi storage engine của table

Trong trường hợp bạn muốn thay đổi storage engine, thì bạn có thể sử dụng lệnh sau:

ALTER TABLE table_name ENGINE=xxx;

Thay xxx bằng engine bạn muốn đổi như InnoDB, MyISAM, MEMORY.

V. Tổng kết

Có mấy vấn đề chính cần tổng kết lại trong bài viết này như sau:

  • Có nhiều storage engine, nhưng bạn nên sử dụng InnoDB để cân bằng giữa các yếu tố.
  • Biết cách xem storage engine của table
  • Biết cách đổi storage engine của table

Nếu có câu hỏi gì, đừng quên gửi câu hỏi tới phambinh.net nhé. Hẹn gặp lại bạn trong bài viết tiếp theo.