MySQL là hệ quản trị cơ sở dữ liệu miễn phí được sử dụng nhiều nhất khi viết bằng ngôn ngữ PHP. Tuy nhiên, khi tạo một bảng trong MySQL sẽ có nhiều kiểu Storage Engine để chúng ta lựa chọn. Trong đó có 3 kiểu lưu trữ bảng được dùng nhiều nhất là InnoDB, MyISAM và Memory.
Bây giờ chúng ta cùng tìm hiểu 3 kiểu lưu trữ này để xem trường hợp nào? lý do nào? ưu nhược điểm của từng loại để có thể lựa chọn phù hợp khi xây dựng website đạt hiệu suất và độ ổn định cao.
1. MyISAM trong MySQL
Để chuyển đổi một Storage Engine sang MyISAM ta sử dụng câu truy vấn:
[code language=”html”]
ALTER TABLE table_name ENGINE = MyISAM;
[/code]
Đây là kiểu Storage Engine mặc định khi tạo một bảng với phiên bản Mysql nhỏ hơn 5.5 và được dùng phổ biến nhất. Một bảng kiểu MyISAM có kích thước lên đến 256TB, nó cho phép lập chỉ mục toàn cột (Full Text Index). Do đó, Storage Engine này cho tốc độ truy suất (Đọc và tìm kiếm) nhanh nhất trong các Storage Engine.
Tuy nhiên, nhược điểm là hoạt động theo kiểu Table Level locking nên khi cập nhật (Thêm, sửa, xóa) 1 bản ghi nào đó trong cùng một bảng thì bảng đó sẽ bị khóa, không cho cập nhật cho đến khi thao tác cập nhật trước đó thực hiện xong. Ngoài ra, do thiết kế đơn giản và không kiểm tra ràng buộc dữ liệu nên loại Storage Engine này dễ bị hỏng chỉ mục và dễ bị Crash.
Tìm hiểu thêm về MyISAM
2. InnoDB trong MySQL
Đây là kiểu Storage Engine mới hơn MyISAM được mặc định với các phiên bản Mysql lớn hơn 5.5, không hỗ trợ Full Text Index, nhưng bù lại có hỗ trợ quan hệ giữa các bảng (Khóa ngoại). Vì vậy, kiểu Storage này tính toàn vẹn dữ liệu và ràng buộc cao nó khắc phục được tình trạng mà MyISAM gặp phải là hỏng chỉ mục và Crash. InnoDB hoạt động theo cơ chế Row Level Locking nên khi cập nhật (Thêm, sửa, xóa) 1 bảng thì chỉ có bản ghi đang bị thao tác bị khóa mà thôi, các thao tác khác trên bảng này vẫn bình thường. Một bảng kiểu này có kích thước lên đến 64TB.
Vì những lý do trên, kiểu InnoDB này thích hợp sử dụng cho các trang web có tần suất cập nhật dữ liệu lớn như Mạng xã hội, diễn đàn, các trang hotdeal (cập nhật giá)….
Nhược điểm của kiểu này là tốn rất nhiều Ram so với MyISAM.
Để chuyển đổi một Storage Engine sang InnoDB ta sử dụng câu truy vấn: (nếu trước đó table này dùng MyISAM và có cột nào đặt Full Text Index thì bạn phải xóa Full Text Index trên cột đó đi mới có thể chuyển được).
[code language=”html”]
ALTER TABLE table_name ENGINE = InnoDB;
[/code]
Tìm hiểu thêm về InnoDB
3. Memory trong MySQL
Được lưu trữ dữ liệu trực tiếp lên RAM nên tốc độ truy xuất và cập nhật rất nhanh. Vì thế, nó được dùng làm các bảng chứa dữ liệu tạm, chứa các phiên làm việc của người dùng, đã là dữ liệu tạm nên khi chúng ta khởi động lại server MySQL thì dữ liệu sẽ mất hết.
Tìm hiểu thêm về Memory
4. Mở rộng
Nếu có nhu cầu hay vì một lý do nào đó bạn cần chuyển đổi kiểu Storage Engine từ MyISAM sang InnoDB hay MyISAM sang MEMORY hay bất cứ Storage Engine nào thì đoạn code dưới đây sẽ giúp được cho bạn.(Lưu ý là nếu dữ liệu lớn có thể sẽ rất lâu nên cần kiên nhẫn).
[code language=”php”]
<?php
// Kết nối database
$dbhost = ‘localhost’;//host
$dbuser = ‘root’;//username
$dbpass = ”;//password
$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die (‘Error connecting to mysql’);
$dbname = ‘databasename’;//tên cơ sở dữ liệu
mysql_select_db($dbname);
$sql = "SHOW tables";
$rs = mysql_query($sql);
while($row = mysql_fetch_array($rs)) {
$tbl = $row[0];
$sql = "ALTER TABLE $tbl ENGINE=INNODB";
mysql_query($sql);
}
?>
[/code]
Việc bạn cần làm là thay đổi các thông số $dbhost, $dbuser, $dbpass, $dbname theo host của bạn.
[thongbao]
- Với một website có lượng truy cập trung bình, tần suất đọc cao như các trang tin tức,blog… thì nên dùng MyISAM…
- Với một website có nhiều truy vấn insert và update như: Diễn đàn, mạng xã hội… thì bạn nên dùng InnoDB.
- Nên dùng MEMORY cho các bảng chứa dữ liệu tạm và thông tin phiên làm việc của người dùng Session chẳng hạn.[/thongbao]