Преобразование большого стола из MyISAM в Innodb

9

У меня есть таблица с 300M строк в формате MyISAM, я хочу преобразовать в Innodb

Моя первоначальная цель состояла в том, чтобы уменьшить использование путем изменения схемы таблицы, чтобы иметь более простые индексы. Я сбросил всю таблицу, удалил ее, воссоздал с меньшим количеством индексов и теперь снова импортирую. Однако я забыл указать, что это должен быть innodb вместо myisam.

Могу ли я просто сделать стандартную ALTER TABLE ... ENGINE = INNODB? Что-нибудь особенное, что я должен знать с таким огромным столом?

Операция импорта данных занимает около 12 часов - мне не хочется делать это снова. Следовательно, почему я хочу просто преобразовать это.

Will Glass
источник
С 300M строками MyISAM, вероятно, быстрее и лучше подойдет для таблицы такого размера!
Марк Хендерсон

Ответы:

14

Следующий отрывок вышел из книги « Высокопроизводительный MySQL, второе издание ».

Это отличная книга, и я рекомендую ее всем.

Краткий ответ:

С вашим размером стола и условиями, независимо от того, какой метод вы выберете, я думаю, что вы потенциально можете долго ждать.


Таблица преобразований

Существует несколько способов преобразования таблицы из одного механизма хранения в другой, каждый из которых имеет свои преимущества и недостатки.

ALTER TABLE

mysql> ALTER TABLE mytable ENGINE = Falcon;

Этот синтаксис работает для всех механизмов хранения, но есть одна загвоздка: это может занять много времени. MySQL будет выполнять построчную копию вашей старой таблицы в новую таблицу. В течение этого времени вы, вероятно, будете использовать всю емкость дискового ввода-вывода сервера, и исходная таблица будет заблокирована для чтения во время выполнения преобразования.

Дамп и импорт

Чтобы получить больше контроля над процессом преобразования, вы можете сначала выбрать дамп таблицы в текстовый файл с помощью утилиты mysqldump. После того, как вы выгрузили таблицу, вы можете просто отредактировать файл дампа, чтобы настроить содержащийся в нем оператор CREATE TABLE. Обязательно измените имя таблицы, а также ее тип, потому что в одной базе данных не может быть двух таблиц с одинаковым именем, даже если они разных типов - и mysqldump по умолчанию записывает команду DROP TABLE перед CREATE TABLE Таким образом, вы можете потерять свои данные, если вы не будете осторожны!

СОЗДАТЬ и ВЫБРАТЬ

Третий метод преобразования - это компромисс между скоростью первого механизма и безопасностью второго. Вместо того чтобы создавать дамп всей таблицы или преобразовывать ее все сразу, создайте новую таблицу и используйте синтаксис MySQL INSERT ... SELECT для ее заполнения следующим образом:

mysql> CREATE TABLE innodb_table LIKE myisam_table;
mysql> ALTER TABLE innodb_table ENGINE=InnoDB;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table;

Это хорошо работает, если у вас мало данных, но если у вас есть, часто более эффективно заполнять таблицу постепенно, фиксируя транзакции между каждым чанком, чтобы журналы отмены не увеличивались в размерах. Предполагая, что id является первичным ключом, выполняйте этот запрос несколько раз (используя большие значения x и y каждый раз), пока вы не скопируете все данные в новую таблицу:

mysql> START TRANSACTION;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table
-> WHERE id BETWEEN x AND y;
mysql> COMMIT;

После этого у вас останется исходная таблица, которую вы можете удалить, когда закончите с ней, и новая таблица, которая теперь полностью заполнена. Будьте осторожны, чтобы заблокировать исходную таблицу, если это необходимо, чтобы избежать получения несогласованной копии данных!

KPWINC
источник
2

Оператор ALTER TABLE, по сути, делает то же самое: сервер создает временную таблицу, в которую он копирует все строки, а затем выполняет RENAME. Форматы на диске сильно различаются между InnoDB и MyISAM, поэтому я не ожидаю, что вы найдете какой-либо ярлык для этого.

Еще одно замечание (о котором вы, возможно, знаете, но это может помочь другим, читающим это): формат InnoDB на диске сильно зависит от первичного ключа, поскольку он группирует записи на его основе. Поэтому при работе с большими таблицами InnoDB дважды подумайте, прежде чем выбирать первичный ключ, потому что его изменение перестраивает всю таблицу, как и в случае проблемы.

В любом случае, я рекомендую сначала сделать несколько тестов на столе среднего размера, а затем провести время.

rpetre
источник
2
Любая операция по изменению таблицы в MySQL (включая добавление индексов) перестраивает таблицу.
Дэвид Пашли