Tìm hiểu về các Storage Engine trong MySQL

Tìm hiểu về các Storage Engine trong MySQL

Ở bài viết trước Tìm hiểu về cơ sở dữ liệu MySQL mình đã giới thiệu cho các bạn những khái niệm cơ bản về MySQL. Ở bài viết này mình sẽ đi sâu hơn về khái niệm Storage Engine trong MySQL. Storage Engine là khái niệm dành cho một bảng dữ liệu, đây là kiến trúc xử lý lưu trữ và xử lý dành cho một bảng mà chúng ta muốn áp dụng. Có 3 kiểu lưu trữ hay được sử dụng đó là: InnoDB, MyISAM và Memory. Nhưng để ứng dụng web của bạn hoạt động ổn định và đạt hiệu suất cao nhất thì các bạn cần nắm được các cách hoạt động của chúng để đưa ra được sự lựa chọn chính xác cho bài toán của mình.

Tìm hiểu về các Storage Engine trong MySQL

Tìm hiểu về các Storage Engine trong MySQL

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 thực hiện xong thì hành động kia mới được tiếp tụ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 hay dễ bị crash, hỏng chỉ mục với những Table có số lượng record lớn.

Chuyển đổi một table sang MyISAM

  • table_name là bảng dữ liệu cần chuyển đổi

2. InnoDB

Đây là kiểu 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 một 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
  • Phù hợp với các ứng dụng yêu cầu tính ổn định và toàn vẹn cao như ngân hàng, ….

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ý hệ thống.

Chuyển đổi một table sang engine InnoDB

Ngoài ra, nếu các bạn đã sử dụng mã nguồn vBulletin, một mã nguồn có phí đang được cộng đồng sử dụng nhiều nhất hiện nay cũng đang sử dụng MyISAM cho các table của mình. Chính vì vậy các diễn đàn vBB thường xuyên bị crash table khiến các quản trị viên phải mệt mỏi vì phải repair thường xuyên.

Lưu ý: Để chuyển đổi storage engine từ MyISAM sang InnoDB, nếu trên field nào đánh chỉ mục FTS (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.

Theo kinh nghiệm của mình, các bạn nên sử dụng InnoDB cho tất cả các Table không sử dụng FullTextSearch, nếu table nào có tần suất Insert/Update/Delete lớn mà vẫn sử dụng FTS thì các bạn có thể tách thành 1 table MyISAM riêng để chuyên phục vụ hoạt động tìm kiếm nhưng không thường xuyên insert/update/delete và chuyển table có tần suất phục vụ Insert/Update/Delete sang InnoDB để tránh crash hệ thống.

3. Memory

Đây là kiểu storage engine không lưu dữ liệu xuống ổ cứng mà được lưu trữ trực tiếp trên RAM. Được sử dụng làm table chứa dữ liệu tạm thời, chứa các phiên làm việc của người dùng.

Ưu điểm

  • Lưu trữ trên RAM, nên tốc độ truy xuất và cập nhật cực nhanh.

Nhược điểm

  • Vì lưu trữ trên RAM, nên sau khi khởi động lại dịch vụ MySQL thì toàn bộ dữ liệu của table này sẽ bị xóa sạch. Vì vậy website của bạn thường thấy trả về 0 online sau khi bị restart server là vì vậy.
  • Sử dụng cơ chế Table Level Locking như MyISAM nên trường hợp tần suất insert/update/delete cao có thể gây nghẽn cổ chai. Nếu xét về lưu trữ trên RAM vì vậy hiệu suất sẽ vẫn luôn tốt hơn MyISAM.

Dung lượng tối đa của một table chạy storage engine là bao nhiêu?

Dung lượng tối đa của một table chạy storage engine được quy định trong thiết lập tham số: max_heap_table_size trong tập tin cấu hình my.cnf của MySQL. Mặc định 1 bảng memory có dung lượng tối đa là 16MB. Nếu sử dụng vượt quá dung lượng quy định này sẽ được báo lỗi là: Table_name is full

Lời kết

  • Ứng dụng có tần suất Insert/Update cao, cần đảm bảo tính toàn vẹn dữ liệu, ràng buộc nhiều table thì các bạn nên sử dụng InnoDB để đảm bảo an toàn cho hệ thống của mình
  • Ứng dụng có tần suất Read đọc dữ liệu cao, nhưng ít Insert/Update thì các bạn nên sử dụng MyISAM, Các kiến trúc sư thiết kế WordPress sử dụng MyISAM cho hệ thống CSDL của mình.
  • Sử dụng Memory cho các table lưu trữ dữ liệu tạm, không quá nhiều thông tin như phiên làm việc của người dùng.

Ngoài ra, việc chuyển đổi storage engine của table diễn ra tương đối lâu nếu Table của bạn có số lượng dữ liệu, bản ghi lớn. Vì vậy khi chuyển đổi các bạn cần kiên nhẫn để MySQL xử lý. Qua bài viết này, mình tin chắc các bạn cũng đã hiểu hơn được về khái niệm Storage Engine và biết được nên sử dụng Storage Engine MyISAM, InnoDB, Memory cho trường hợp nào rồi phải không? Chúc các bạn có thêm kinh nghiệm hữu ích từ kiến thức web nhé!. Nếu có sai sót gì mời các bạn cùng mình thảo luận qua mục bình luận.