Chuyển đổi bảng lớn từ MyISAM sang Innodb


9

Tôi có một bảng với khoảng 300M hàng ở định dạng MyISAM tôi muốn chuyển đổi sang Innodb

Mục tiêu ban đầu của tôi là giảm sử dụng bằng cách thay đổi lược đồ bảng để có các chỉ mục đơn giản hơn. Tôi đã đổ tất cả các bảng, bỏ nó, tạo lại nó với ít chỉ mục hơn và hiện đang nhập lại. Tuy nhiên, tôi quên xác định rằng nó phải là innodb thay vì myisam.

Tôi chỉ có thể thực hiện BẢNG TUYỆT VỜI tiêu chuẩn ... ĐỘNG CƠ = INNODB? Có điều gì đặc biệt tôi nên biết với một cái bàn khổng lồ như vậy không?

Hoạt động nhập dữ liệu mất khoảng 12 giờ - Tôi không muốn làm điều đó một lần nữa. Do đó tại sao tôi muốn chuyển đổi nó.


Với 300M hàng, MyISAM có thể nhanh hơn và phù hợp hơn cho một bảng có kích thước đó!
Mark Henderson

Câu trả lời:


14

Đ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!


2

Câu lệnh ALTER TABLE về cơ bản thực hiện cùng một điều: máy chủ tạo một bảng tạm thời trong đó nó sao chép tất cả các hàng và sau đó thực hiện RENAME. Các định dạng trên đĩa cực kỳ khác nhau giữa InnoDB và MyISAM, vì vậy tôi không mong bạn tìm thấy bất kỳ lối tắt nào cho việc này.

Một nhận xét khác (mà bạn có thể biết, nhưng nó sẽ giúp người khác đọc được điều này): định dạng trên đĩa cho InnoDB phụ thuộc nhiều vào khóa chính, vì nó phân cụm các bản ghi dựa trên nó. Vì vậy, khi làm việc với các bảng InnoDB lớn, hãy suy nghĩ hai lần trước khi chọn khóa chính, vì thay đổi nó sẽ xây dựng lại toàn bộ bảng, giống như vấn đề trong tay.

Dù sao, tôi khuyên bạn nên thực hiện một vài thử nghiệm đầu tiên trên một bảng có kích thước vừa phải và thời gian những thử nghiệm đó.


2
Bất kỳ hoạt động thay đổi bảng nào trong MySQL (và bao gồm thêm chỉ mục) sẽ xây dựng lại bảng.
David Pashley
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.