MyISAM là một trong những công cụ lưu trữ phổ biến nhất trong MySQL. MyISAM thường xuyên là lựa chọn thứ hai sau InnoDB - trong bài đăng trên blog này, chúng tôi sẽ cố gắng tìm ra cách tốt nhất để làm việc với công cụ này.
MyISAM là gì?
MyISAM là một trong những công cụ lưu trữ của MySQL. MyISAM dựa trên ISAM (Phương pháp truy cập tuần tự được lập chỉ mục), một thuật toán lập chỉ mục do IBM phát triển cho phép truy xuất thông tin từ các tập dữ liệu lớn một cách nhanh chóng. Tuy nhiên, nó không hoạt động tốt khi đồng thời đọc từ và ghi vào một bảng, do bảng của nó bị khóa. Nó cũng không hỗ trợ các giao dịch.
Đối với một số kỹ sư MySQL, công cụ này là lựa chọn phổ biến nhất sau InnoDB:công cụ lưu trữ MyISAM là công cụ lưu trữ duy nhất được cung cấp bởi MySQL vào năm 2005 và đã có sẵn để sử dụng trong hơn 20 năm. MyISAM là công cụ lưu trữ mặc định cho MySQL lên đến phiên bản 5.5.
MyISAM từ Bên trong
Minh họa về cách MyISAM hoạt động từ bên trong không nằm trong phạm vi của blog này, nhưng chúng tôi có thể cung cấp cho bạn các cài đặt giúp bạn tối ưu hóa hiệu suất của công cụ:
- Myisam_sort_buffer_size xác định bộ đệm được cấp phát khi chỉ mục được sắp xếp bằng cách chạy các truy vấn REPAIR, CREATE INDEX hoặc ALTER TABLE.
- Key_buffer_size xác định kích thước của bộ đệm được sử dụng cho các khối chỉ mục trên các bảng MyISAM. Việc tăng thông số này có thể giúp xử lý chỉ mục tốt hơn.
- Sort_buffer_size mô tả kích thước của bộ đệm được cấp phát cho các luồng cần thực hiện các thao tác sắp xếp.
- Read_buffer_size mô tả kích thước của bộ đệm được cấp phát cho các luồng thực hiện các thao tác quét tuần tự.
- Write_buffer_size mô tả kích thước của bộ đệm ghi.
Bốn tham số này rất quan trọng, nhưng mặc dù chúng quan trọng, bạn cũng nên để ý đến biến key_buffer_size. Biến key_buffer_size xác định kích thước của các bộ đệm chỉ mục được lưu giữ trong bộ nhớ - hãy nghĩ về nó như là bản đối chiếu innodb_buffer_pool_size, nhưng đối với MyISAM. Nếu máy chủ của bạn chủ yếu bao gồm các bảng MyISAM, bạn có thể phân bổ khoảng 25% hoặc nhiều hơn bộ nhớ RAM khả dụng trên máy chủ cho biến key_buffer_size. Ngoài ra còn có một cách khác để xác định giá trị của tham số key_buffer_size - chỉ cần so sánh giá trị key_read_requests (tổng giá trị của các yêu cầu đọc chỉ mục) và giá trị key_reads (giá trị của key_reads là số lượng yêu cầu phải có đọc từ đĩa). Các giá trị cho các tham số đó có thể được truy xuất bằng cách xem các biến trạng thái máy chủ (chỉ cần đưa ra truy vấn HIỂN THỊ TRẠNG THÁI TOÀN CẦU trên máy chủ MySQL của bạn). Cũng có lợi khi lưu ý rằng nếu key_reads trả về một giá trị lớn, thì giá trị của key_buffer_size có thể quá nhỏ.
MyISAM và MySQL 8.0
Nếu bạn hỏi một số kỹ sư MySQL, họ sẽ nói rằng MyISAM không nên được sử dụng nữa. Tại sao? Một số người nói rằng thực tế là vì khi MySQL nâng cao, họ đã thêm phần lớn các tính năng mà trước đây chỉ có thể thấy trong MyISAM vào InnoDB khiến MyISAM trở nên lỗi thời một cách hiệu quả:
- Các chỉ mục toàn văn đã có sẵn trong InnoDB kể từ phiên bản 5.6.
- Không gian bảng di động đã có trong InnoDB kể từ phiên bản 5.6.
- Đã có chỉ mục không gian trong InnoDB kể từ phiên bản 5.7.
- Đã có bản cập nhật cuối cùng cho bảng trong InnoDB kể từ phiên bản 5.7.
Vì vậy, bạn vẫn nên sử dụng MyISAM chứ? Chắc là không. Tuy nhiên, có một lưu ý - hãy nhớ rằng các truy vấn COUNT (*) đơn giản có thể sẽ hoạt động trên MyISAM nhanh hơn so với trên InnoDB - MyISAM lưu trữ số trong siêu dữ liệu bảng, InnoDB thì không.
Tôi đang sử dụng MyISAM và muốn chuyển sang InnoDB, Tôi phải làm gì?
Nếu bạn vẫn sử dụng MyISAM và muốn chuyển sang InnoDB, chỉ cần chuyển đổi tất cả các bảng của bạn sang InnoDB. Rõ ràng là nói thì dễ hơn làm, nhưng đây là một hướng dẫn đơn giản:
- Tìm ra bảng nào trong phiên bản MySQL của bạn đang sử dụng MyISAM:
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = ‘database_name’ AND ENGINE = ‘MyISAM’;
- Chuyển đổi tất cả các bảng MyISAM của bạn thành InnoDB:
ALTER TABLE `table_name` ENGINE = InnoDB;
Nếu bạn không muốn chạy lần lượt nhiều câu lệnh ALTER TABLE, hãy xem xét đặt các câu lệnh ALTER TABLE vào một vòng lặp. Vậy là xong - bạn đã hoàn thành!
Tóm tắt
MyISAM là một trong những công cụ MySQL phổ biến nhất. Công cụ này là mặc định cho các phiên bản MySQL lên đến 5.5. Công cụ là một trong những lựa chọn phổ biến nhất sau InnoDB, nhưng nó có thể được gọi là lỗi thời kể từ MySQL 8.0 - MySQL đã đảm bảo rằng mọi thứ có thể được thực hiện với MyISAM cũng có thể được thực hiện khi InnoDB được sử dụng, vì vậy tại thời điểm này MyISAM chỉ hữu ích nếu bạn muốn các truy vấn COUNT (*) đơn giản nhanh hơn. Các truy vấn như vậy sẽ nhanh hơn vì MyISAM lưu trữ số trong siêu dữ liệu bảng - các công cụ MySQL khác thì không.