Skip to main content

MySQL Storage Engines

Giới thiệu

Kiến trúc logic của MySQL nhìn tổng quan có thể được mô tả như hình dưới đây:

logical_mysql_architecture.jpeg

Storage Engine thực chất là cách MySQL lưu trữ dữ liệu trên đĩa cứng. MySQL lưu mỗi database như là một thư mục con nằm dưới thư mục data. Khi một table được tạo ra, MySQL sẽ lưu định nghĩa bảng ở file đuôi .frm và tên trùng với tên của bảng được tạo. Việc quản lý định nghĩa bảng là nhiệm vụ của MySQL server, dù rằng mỗi storage engine sẽ lưu trữ và đánh chỉ mục (index) dữ liệu khác nhau.

Tiêu chí lựa chọn engine:

  • Transactions: Nếu ứng dụng yêu cầu transactions, InnoDB là lựa chọn duy nhất. Nếu không yêu cầu transactions, MyISAM là lựa chọn tốt.
  • Concurrency: Nếu yêu cầu chịu tải cao và không cần thiết transactions, MyISAM là lựa chọn số 1.
  • Sao lưu: Các engine đều phần nào hỗ trợ sao lưu. Ngoài ra ta cần hỗ trợ sao lưu trên cả quan điểm thiết kế hệ thống. Ví dụ: bạn thiết kế database server gồm master và slave, master yêu cần transaction nên dùng innodb, slave cần sao lưu và đọc nên có thể dùng MyISAM. Cơ chế đồng bộ master-slave sẽ giúp bạn quản lý sự khác nhau giữa các engine nhưng đảm bảo tính sao lưu. Tiêu chí này có trọng số nhỏ.
  • Phục hồi sau crash: MyISAM có khả năng phục hồi sau crash kém hơn InnoDB.
  • Tính năng theo yêu cầu hệ thống: Nếu yêu cầu là logging, MyISAM hoặc Archive là lựa chọn hợp lý. Nếu cần lưu trực tiếp CSV, CSV engine là lựa chọn đáng cân nhắc. Nếu ứng dụng không thay đổi dữ liệu mấy (ví dụ cơ sở dữ liệu sách), MyISAM và tính năng nén là lựa chọn phù hợp.
1. MyISAM engine

Đặc điểm:

  • full-text indexing
  • compression.
  • spatial functions (GIS)
  • Không hỗ trợ transactions
  • Không hỗ trợ row-level lock.

Lưu trữ:

MyISAM lưu mỗi bảng dữ liệu trên 2 file: .MYD cho dữ liệu và .MYI cho chỉ mục. Row có 2 loại: dynamic và static (tuỳ thuộc bạn có dữ liệu thay đổi độ dài hay không). Số lượng row tối đa có thể lưu trữ bị giới hạn bởi hệ điều hành, dung lượng đĩa cứng. MyISAM mặc định sử dụng con trỏ độ dài 6 bytes để trỏ tới bản ghi dữ liệu, do vậy giới hạn kích thước dữ liệu xuống 256TB.

Tính năng:

  • MyISAM lock toàn bộ table. User (MySQL server) chiếm shared-lock khi đọc và chiếm exclusive-lock khi ghi. Tuy vậy, việc đọc ghi có thể diễn ra đồng thời!
  • MyISAM có khả năng tự sửa chữa và phục hồi dữ liệu sau khi hệ thống crashed.
  • Dùng command check table / repair table để kiểm tra lỗi và phục hồi sau khi bị lỗi.
  • MyISAM có thể đánh chỉ mục full-text, hỗ trợ tìm kiếm full-text.
  • MyISAM không ghi dữ liệu ngay vào ổ đĩa cứng, mà ghi vào 1 buffer trên memory (và chỉ ghi vào đĩa cứng sau 1 khoảng thời gian), do đó tăng tốc độ ghi. Tuy vậy, sau khi server crash, ta cần phải phục hồi dữ liệu bị hư hỏng bằng myisamchk.
  • MyISAM hỗ trợ nén dữ liệu, hỗ trợ tăng tốc độ đọc dữ liệu. Mặc dù vậy dữ liệu sau khi nén không thể cập nhật được.
2. InnoDB engine

Đặc điểm:

  • Là engine phức tạp nhất trong các engine của MySQL
  • Hỗ trợ transactions
  • Hỗ trợ phục hồi, sửa chữa tốt

Lưu trữ:

InnoDB lưu dữ liệu trên 1 file (thuật ngữ gọi là tablespace).

Tính năng:

  • InnoDB hỗ trợ MVCC (Multiversion Concurrency Control) để cải thiện việc truy cập đồng thời và hỗ trợ chiến thuật next-key locking.
  • InnoDB được xây dựng dựa trên clustered index, do đó việc tìm kiếm theo primary key có hiệu năng rất cao. InnoDB không hỗ trợ sắp xếp index do vậy việc thay đổi cấu trúc bảng sẽ dẫn tới toàn bộ dữ liệu phải được đánh chỉ mục từ đầu (CHẬM với những bảng lớn).
3. Memory engine

Đặc điểm:

  • Còn được gọi là HEAP tables.

Lưu trữ:

Tất cả dữ liệu đều nằm trên memory.

Tính năng:

  • Sau khi server restart, cấu trúc bảng được bảo toàn, dữ liệu bị mất hết.
  • Memory engine sử dụng HASH index nên rất nhanh cho query lookup.
  • Memory engine dùng table-level locking do vậy tính concurrency không cao.
4. Archive engine

Đặc điểm:

  • Chỉ hỗ trợ Insert và Select.
  • Không đánh chỉ mục
  • Dữ liệu được buffer và nén bằng zlib nên tốn ít I/O, tốc độ ghi do đó cao.

Tính năng:

  • Tốc độ ghi cao, phù hợp cho ứng dụng log.
5. CSV engine

Đặc điểm:

  • Coi file CSV như là 1 table.
  • Không hỗ trợ đánh chỉ mục

Tính năng:

  • Nếu bài toán là trích xuất thông tin từ file CSV và ghi vào cơ sở dữ liệu, đồng thời cần kết quả CSV ngay từ DB, engine này có vẻ thích hợp.
6. Falcon engine

Đặc điểm:

  • Được thiết kế cho phần cứng hiện đại: server 64 bit, bộ nhớ “thênh thang”
  • Vẫn còn khá mới, chưa có nhiều usercase
7. Maria engine

Đặc điểm:

  • Được thiết kế bởi với mục đích thay thế MyISAM
  • Hỗ trợ transactions theo lựa chọn
  • Khôi phục lỗi
  • Row-level locking và MVCC
  • Hỗ trợ BLOB tốt hơn.
8. Merge engine

Đặc điểm:

  • Merge table là một bảng ảo kết hợp nhiều bảng MyISAM có cấu trúc tương tự như một bảng. Công cụ lưu trữ MERGE còn được gọi là công cụ MRG_MyISAM. Bảng MERGE không có index, thay vào đó, nó sử dụng các index của các bảng thành phần.
  • Sử dụng Merge table, bạn có thể tăng tốc độ thực hiện các lệnh join giữa các bảng. MySQL chỉ cho phép bạn thực hiện các lệnh SELECT, DELETE, UPDATE và INSERT trên Merge table. Khi bạn thực hiện DROP TABLE trên Merge table, chỉ Merge table bị xóa, các bảng thành phần không bị ảnh hưởng
9. Federated engine

Công cụ lưu trữ Federated cho phép bạn quản lý dữ liệu từ máy chủ MySQL từ xa (remote) mà không cần sử dụng công nghệ cluster hoặc replication. Bảng liên kết cục bộ không lưu trữ dữ liệu. Khi bạn truy vấn dữ liệu từ một bảng được liên kết cục bộ (local), dữ liệu sẽ được kéo tự động từ các bảng được liên kết từ xa (remote).