У меня есть таблица с 300M строк в формате MyISAM, я хочу преобразовать в Innodb
Моя первоначальная цель состояла в том, чтобы уменьшить использование путем изменения схемы таблицы, чтобы иметь более простые индексы. Я сбросил всю таблицу, удалил ее, воссоздал с меньшим количеством индексов и теперь снова импортирую. Однако я забыл указать, что это должен быть innodb вместо myisam.
Могу ли я просто сделать стандартную ALTER TABLE ... ENGINE = INNODB? Что-нибудь особенное, что я должен знать с таким огромным столом?
Операция импорта данных занимает около 12 часов - мне не хочется делать это снова. Следовательно, почему я хочу просто преобразовать это.
Ответы:
Следующий отрывок вышел из книги « Высокопроизводительный MySQL, второе издание ».
Это отличная книга, и я рекомендую ее всем.
Краткий ответ:
С вашим размером стола и условиями, независимо от того, какой метод вы выберете, я думаю, что вы потенциально можете долго ждать.
Таблица преобразований
Существует несколько способов преобразования таблицы из одного механизма хранения в другой, каждый из которых имеет свои преимущества и недостатки.
ALTER TABLE
Этот синтаксис работает для всех механизмов хранения, но есть одна загвоздка: это может занять много времени. MySQL будет выполнять построчную копию вашей старой таблицы в новую таблицу. В течение этого времени вы, вероятно, будете использовать всю емкость дискового ввода-вывода сервера, и исходная таблица будет заблокирована для чтения во время выполнения преобразования.
Дамп и импорт
Чтобы получить больше контроля над процессом преобразования, вы можете сначала выбрать дамп таблицы в текстовый файл с помощью утилиты mysqldump. После того, как вы выгрузили таблицу, вы можете просто отредактировать файл дампа, чтобы настроить содержащийся в нем оператор CREATE TABLE. Обязательно измените имя таблицы, а также ее тип, потому что в одной базе данных не может быть двух таблиц с одинаковым именем, даже если они разных типов - и mysqldump по умолчанию записывает команду DROP TABLE перед CREATE TABLE Таким образом, вы можете потерять свои данные, если вы не будете осторожны!
СОЗДАТЬ и ВЫБРАТЬ
Третий метод преобразования - это компромисс между скоростью первого механизма и безопасностью второго. Вместо того чтобы создавать дамп всей таблицы или преобразовывать ее все сразу, создайте новую таблицу и используйте синтаксис MySQL INSERT ... SELECT для ее заполнения следующим образом:
Это хорошо работает, если у вас мало данных, но если у вас есть, часто более эффективно заполнять таблицу постепенно, фиксируя транзакции между каждым чанком, чтобы журналы отмены не увеличивались в размерах. Предполагая, что id является первичным ключом, выполняйте этот запрос несколько раз (используя большие значения x и y каждый раз), пока вы не скопируете все данные в новую таблицу:
После этого у вас останется исходная таблица, которую вы можете удалить, когда закончите с ней, и новая таблица, которая теперь полностью заполнена. Будьте осторожны, чтобы заблокировать исходную таблицу, если это необходимо, чтобы избежать получения несогласованной копии данных!
источник
Оператор ALTER TABLE, по сути, делает то же самое: сервер создает временную таблицу, в которую он копирует все строки, а затем выполняет RENAME. Форматы на диске сильно различаются между InnoDB и MyISAM, поэтому я не ожидаю, что вы найдете какой-либо ярлык для этого.
Еще одно замечание (о котором вы, возможно, знаете, но это может помочь другим, читающим это): формат InnoDB на диске сильно зависит от первичного ключа, поскольку он группирует записи на его основе. Поэтому при работе с большими таблицами InnoDB дважды подумайте, прежде чем выбирать первичный ключ, потому что его изменение перестраивает всю таблицу, как и в случае проблемы.
В любом случае, я рекомендую сначала сделать несколько тестов на столе среднего размера, а затем провести время.
источник