Đoạn trích sau đây ra khỏi cuốn sách " MySQL hiệu suất cao, phiên bản thứ hai ".
Đây là một cuốn sách tuyệt vời và tôi muốn giới thiệu nó cho bất cứ ai.
Câu trả lời ngắn gọn là:
Với kích thước và điều kiện bảng của bạn, cho dù bạn chọn phương pháp nào, tôi nghĩ bạn có khả năng phải chờ đợi lâu.
Chuyển đổi bảng
Có một số cách để chuyển đổi một bảng từ một công cụ lưu trữ sang một công cụ lưu trữ khác, mỗi cách đều có ưu điểm và nhược điểm.
BẢNG BẢNG
mysql> ALTER TABLE mytable ENGINE = Falcon;
Cú pháp này hoạt động cho tất cả các công cụ lưu trữ, nhưng có một nhược điểm: nó có thể mất rất nhiều thời gian. MySQL sẽ thực hiện sao chép từng hàng của bảng cũ của bạn vào một bảng mới. Trong thời gian đó, có thể bạn sẽ sử dụng tất cả dung lượng I / O của máy chủ và bảng gốc sẽ bị khóa trong khi chuyển đổi chạy.
Đổ và nhập
Để có thêm quyền kiểm soát quá trình chuyển đổi, trước tiên bạn có thể chọn kết xuất bảng vào tệp văn bản bằng tiện ích mysqldump. Khi bạn đã đổ bảng, bạn chỉ cần chỉnh sửa tệp kết xuất để điều chỉnh câu lệnh CREATE TABLE mà nó chứa. Hãy chắc chắn thay đổi tên bảng cũng như loại của nó, bởi vì bạn không thể có hai bảng có cùng tên trong cùng một cơ sở dữ liệu ngay cả khi chúng thuộc các loại khác nhau, và mặc định để viết lệnh DROP TABLE trước khi TẠO BẢNG , vì vậy bạn có thể mất dữ liệu nếu không cẩn thận!
TẠO VÀ CHỌN
Kỹ thuật chuyển đổi thứ ba là một sự thỏa hiệp giữa tốc độ của cơ chế thứ nhất và sự an toàn của cơ chế thứ hai. Thay vì bỏ toàn bộ bảng hoặc chuyển đổi tất cả bảng cùng một lúc, hãy tạo bảng mới và sử dụng cú pháp INSERT ... CHỌN của MySQL để điền vào bảng, như sau:
mysql> CREATE TABLE innodb_table LIKE myisam_table;
mysql> ALTER TABLE innodb_table ENGINE=InnoDB;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table;
Điều đó hoạt động tốt nếu bạn không có nhiều dữ liệu, nhưng nếu bạn làm như vậy, việc tăng dần bảng sẽ hiệu quả hơn, cam kết giao dịch giữa mỗi khối để nhật ký hoàn tác không phát triển lớn. Giả sử id đó là khóa chính, hãy chạy truy vấn này nhiều lần (sử dụng các giá trị lớn hơn của x và y mỗi lần) cho đến khi bạn sao chép tất cả dữ liệu vào bảng mới:
mysql> START TRANSACTION;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table
-> WHERE id BETWEEN x AND y;
mysql> COMMIT;
Sau khi làm như vậy, bạn sẽ được để lại với bảng gốc mà bạn có thể bỏ qua khi bạn hoàn thành với bảng đó và bảng mới, hiện đã được điền đầy đủ. Hãy cẩn thận để khóa bảng gốc nếu cần để tránh việc sao chép dữ liệu không nhất quán!