Преобразования таблиц (InnoDB, MyISAM) в MySQL

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

В этом блоге мы рассмотрим три наиболее распространенных способа.


Оглавление статьи[Показать]


 

ALTER TABLE

Простейший способ преобразования таблицы из одной подсистемы в другую — ис­пользование команды ALTER TABLE. Следующая команда преобразует таблицу mytable к типу InnoDB:

mysql> ALTER TABLE mytable ENGINE = InnoDB;

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

При изменении подсистемы хранения утрачиваются все присущие старой подси­стеме возможности. Например, после преобразования таблицы InnoDB в MyISAM, а потом обратно будут потеряны все внешние ключи, определенные в исходной таблице InnoDB.

 

Экспорт и импорт

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

 

CREATE и SELECT

Третий способ преобразования обеспечивает компромисс между скоростью перво­го и безопасностью второго. Вместо того чтобы экспортировать всю таблицу или преобразовывать ее за один прием, создайте новую таблицу и используйте для ее заполнения команду 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 является первичным ключом, запустите этот запрос несколько раз (каждый раз задавая все большие значения х и у), пока не скопируете все данные в новую таблицу:

 

mysql> START TRANSACTION;

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

mysql> COMMIT;

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

 

Вас заинтересует / Intresting for you:

InnoDB: подсистема хранения ба...
InnoDB: подсистема хранения ба... 4921 просмотров Ирина Светлова Mon, 07 Jan 2019, 06:34:07
MyISAM: подсистема хранения ба...
MyISAM: подсистема хранения ба... 2669 просмотров Ирина Светлова Wed, 04 Aug 2021, 19:39:29
Модель развития базы данных My...
Модель развития базы данных My... 1416 просмотров Ирина Светлова Thu, 10 Jan 2019, 12:29:03
Использование MySQL в качестве...
Использование MySQL в качестве... 2261 просмотров Андрей Волков Tue, 01 Oct 2019, 05:41:51
Войдите чтобы комментировать