MySQL hỗ trợ nhiều kiểu bảng dữ liệu hoặc các máy chủ lưu trữ dữ liệu khác nhau để giúp tối ưu hóa cơ sở dữ liệu. Kiểu dữ liệu quen thuộc đối với lập trình viên trên nền tảng LAMP thường là MyISAM. Nhưng ngoài ra còn có nhiều kiểu bảng dữ liệu khác như InnoDB, BDB, MERGE, HEAP. Trong bài viết này, tôi xin đưa ra một số điểm khác biệt trong 2 kiểu bảng dữ liệu được sử dụng nhiều nhất hiện nay là MyISAM và InnoDB để bạn dễ lựa chọn khi quyết định lựa chọn engine nền bên dưới của MySQL.
- InnoDB hỗ trợ relationship (data integrity and foreign key constraints) còn MyISAM thì ko: Đa phần các open source đều không coi trọng việc này nhưng nếu ứng dụng của bạn bắt buộc phải dùng foreign key constraints thì InnoDB là lựa chọn.
- InnoDB hỗ trợ transactions còn MyISAM thì không: Nếu hệ thống của bạn dùng trong các ứng dụng ngân hàng hoặc phải thực hiện việc giao dịch thì chắc chắn là MyISAM sẽ bị loại.
- InnoDB thiên về row-level locking còn MyISAM thiên về table locking: Tức là khi hệ thống của bạn phải thực hiện nhiều các thao tác insert/update thì InnoDB là tốt hơn, còn nếu hệ thống của bạn thực hiện các thao tác select là chủ yếu thì dùng MyISAM là lựu chọn tốt hơn.
- MyISAM hỗ trợ full-text searches còn InnoDB thì không: Đây rõ ràng là một điểm yếu của InnoDB so với MyISAM, và dĩ nhiên là trong hệ thống có dùng full-text searches thì phải loại InnoDB đầu nước.
- Tốc độ của MyISAM cao hơn InnoDB: Khi hệ thống của bạn đòi hỏi performance cao thì MyISAM là lựa chọn tốt hơn.
Đặc điểm quan trọng nhất để phân biệt các kiểu bảng dữ liệu ở trên là tính có an toàn giao tác hoặc không. Chỉ các bảng dữ liệu kiểu InnoDB và BDB là có tính an toàn giao tác (transaction) và chỉ những bảng dữ liệu kiểu MyISAM hỗ trợ chỉ mục toàn văn bản (full text index) và các đặc tính tìm kiếm. MyISAM cũng là kiểu bảng dữ liệu mặc định khi bạn tạo bảng dữ liệu mới mà không khai báo kiểu bảng dữ liệu cụ thể.
Những so sánh trên đây giúp bạn dễ dàng lựa chọn kiểu bảng dữ liệu phù hợp khi sử dụng. Thú thật, trước giờ tôi cũng toàn sử dụng MyISAM nên cũng mù mờ về InnoDB. Bài viết này được viết với mục đích ghi chú lại những điểm khác nhau về 2 kiểu lưu trữ CSDL nhằm mục đích chia sẻ và ghi nhớ khi cần. Bạn có thể tìm hiểu thêm về sự khác nhau của InnoDB và MyISAM ở đây.
Phụ mục
Một số kiểu dữ liệu khác
Như phần đầu bài tôi đã nói, ngoài MyISAM và InnoDB, MySQL còn có nhiều kiểu lưu trữ cơ sở dữ liệu khác nữa. Dưới đây xin giới thiệu chúng, bạn nào muốn tìm hiểu sâu hơn thì Google nhé:
ISAM
ISAM đã bị loại khỏi các phiên bản từ 5.x trở đi. Nó được thay thế bởi MyISAM. Một bảng dữ liệu kiểu ISAM có dung lượng tối đa là 4GB và không thể di chuyển.
MyISAM
Kiểu MyISAM là mặc định khi tạo ra một bảng dữ liệu mới. Các thao tác trên bảng dữ liệu kiểu này diễn ra rất nhanh, tuy nhiên nó lại không hỗ trợ đặc tính an toàn giao tác. Dung lượng của một bảng dữ liệu kiểu MyISAM phụ thuộc và hệ điều hành. Bảng dữ liệu kiểu MyISAM có thể chuyển từ hệ thống này sang hệ thống khác. Với bảng dữ liệu kiểu MyISAM bạn có thể có tới 64 khóa và chiều dài tối đa của khóa là 1024byte.
InnoDB
Khác với bảng dữ liệu kiểu MyISAM, bảng dữ liệu kiểu InnoDB có đặc tính an toàn giao tác và hỗ trợ khóa dòng (row level locking). Các khóa ngoại được hỗ trợ trong kiểu InnoDB. Tập tin dữ liệu của bảng dữ liệu kiểu InnoDB có thể lưu trữ ở nhiều file khác nhau. Vì thế dung lượng của bảng InnoDB phụ thuộc vào dung lượng của ổ đĩa. Giống như bảng dữ liệu kiểu MyISAM, tập tin dữ liệu của InnoDB có thể chuyển từ hệ thống này sang hệ thống khác. Điểm bất lợi của InnoDB so với MyISAM là nó cần nhiều không gian lưu trữ.
BDB
BDB cũng tương tự như InnoDB ở tính an toàn giao tác. Nó hỗ trợ khóa trang (page level locking). Tuy nhiên tập tin dữ liệu cả DB lại không thể chuyển đổi giữa các hệ thống.
MERGE
Bảng dữ liệu kiểu Merge được thêm vào để giải quyết vấn đề hạn chế của MyISAM. Nó biến nhiều bảng MyISAM thành một bảng dữ liệu vì thế những hạn chế về dung lượng của MyISAM không còn là trở ngại kĩ thuật nữa.
HEAP
Bảng dữ liệu kiểu Heap được lưu trữ trong bộ nhớ. Do đó, nó là kiểu bảng được thao tác nhanh nhất. Do bởi cơ chế lưu trữ, dữ liệu sẽ bị mất đi khi máy tính không còn nguồn điện và đối khi nó còn có thể gây ra tình trạng tràn bộ nhớ đối với máy chủ csdl. Các bảng Heap không hỗ trợ những trường có kiểu AUTO_INCREMENT, BLOB và TEXT.
Cập nhật: từ phiên bản MySQL 5.6.4 trở đi, FULLTEXT đã được hỗ trợ trog InnoDB.
Hung Nguyen says
Thank you! :)
ola kul says
Cảm ơn bác đã chia sẻ
bancamden says
Bài viết của bác rất đầu tư! Thanks nhiều!
letai says
Bài Viết Hay Và Bổ Ích Tks
Alan Duy says
Bác nhân bổ sung hoặc sửa lại nội dung bài viết đoạn này nhé
“MyISAM hỗ trợ Fulltext search còn InnoDB thì không”
Từ phiên bản mysql 5.6 ra đời thì InnoDB đã hỗ trợ Fulltext search rồi nhé!
Nguyễn Duy Nhân says
cám ơn bác cập nhật thông tin nhé ! Chính xác là 5.6.4.
Sơn Ka says
Đọc ở đây thì thấy InnoDb nhanh hơn MyISAM mà nhỉ?
https://www.quora.com/How-do-I-reduce-MySQL-query-execution-time-from-90-seconds-to-less-than-5-I-executed-a-query-with-the-main-table-joined-with-5-tables-90-sec-I-added-indices-into-each-of-the-criteria-45-seconds-I-marked-only-necessary-fields-25-seconds-What-now