Spec-Zone .ru
спецификации, руководства, описания, API

5.5.1. Краткий обзор Онлайнового DDL

Исторически, много операций DDL на InnoDB таблицы были дороги. Многие ALTER TABLE операции, работавшие, составляя новую, пустую таблицу, определенную с помощью требуемых табличных опций и, индексируют, затем копируя существующие строки в новую таблицу один за другим, обновляя индексирование, поскольку строки были вставлены. После того, как все строки от исходной таблицы были скопированы, старая таблица была отброшена, и копия была переименована с именем исходной таблицы.

MySQL 5.5, и MySQL 5.1 с Плагином InnoDB, оптимизированным CREATE INDEX и DROP INDEX избегать копирующего таблицу поведения. Та функция была известна как Быстрое Создание индекса. MySQL 5.6 улучшает много других типов ALTER TABLE операции, чтобы избежать копировать таблицу. Другое улучшение позволяет SELECT запросы и INSERT, UPDATE, и DELETE Операторы (DML), чтобы продолжиться, в то время как таблица изменяется. Эта комбинация функций теперь известна как онлайновый DDL.

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

Хотя никакие изменения синтаксиса не требуются в CREATE INDEX или DROP INDEX команды, некоторые факторы влияют на производительность, использование пространства, и семантику этой работы (см. Раздел 5.5.9, "Ограничения Онлайнового DDL").

Онлайновые улучшения DDL в MySQL 5.6 улучшают много операций DDL, которые прежде потребовали табличной копии, блокировал операции DML на таблице, или обоих. Таблица 5.9, "Сводка Онлайнового Состояния для Операций DDL" показывает изменения ALTER TABLE оператор и шоу, как онлайновая функция DDL применяется к каждому.

Таблица 5.9. Сводка Онлайнового Состояния для Операций DDL

Работа Оперативный? Копирует Таблицу? Позволяет Параллельный DML? Позволяет Параллельный Запрос? Примечания
CREATE INDEX, ADD INDEX Yes* No* Да Да Некоторые ограничения для FULLTEXT индексируйте; см. следующую строку. В настоящий момент работа не является оперативной (то есть, она копирует таблицу), если то же самое индексирует быть создаваемым, был также отброшен более ранним пунктом в том же самом ALTER TABLE оператор.
ADD FULLTEXT INDEX Да No* Нет Да Создание первого FULLTEXT индексируйте для таблицы, включает табличную копию, если нет предоставленный пользователем FTS_DOC_ID столбец. Последующий FULLTEXT индексирует на той же самой таблице, может быть создан оперативный.
DROP INDEX Да Нет Да Да
Установите значение по умолчанию для столбца Да Нет Да Да Изменяет .frm файл только, не файл данных.
Измените автоинкрементное значение для столбца Да Нет Да Да Изменяет значение, сохраненное в памяти, не файле данных.
Добавьте ограничение внешнего ключа Yes* No* Да Да Чтобы избежать копировать таблицу, отключить foreign_key_checks во время ограничительного создания.
Отбросьте ограничение внешнего ключа Да Нет Да Да foreign_key_checks опция может быть включена или отключена.
Переименуйте столбец Yes* No* Yes* Да Чтобы позволить параллельный DML, сохраните тот же самый тип данных и только измените имя столбца.
Добавьте столбец Да Да Yes* Да Параллельный DML не позволяется, добавляя столбец автоприращения. Хотя ALGORITHM=INPLACE позволяется, данные реорганизовываются существенно, таким образом, это - все еще дорогая работа.
Отбросьте столбец Да Да Да Да Хотя ALGORITHM=INPLACE позволяется, данные реорганизовываются существенно, таким образом, это - все еще дорогая работа.
Переупорядочьте столбцы Да Да Да Да Хотя ALGORITHM=INPLACE позволяется, данные реорганизовываются существенно, таким образом, это - все еще дорогая работа.
Изменение ROW_FORMAT свойство Да Да Да Да Хотя ALGORITHM=INPLACE позволяется, данные реорганизовываются существенно, таким образом, это - все еще дорогая работа.
Изменение KEY_BLOCK_SIZE свойство Да Да Да Да Хотя ALGORITHM=INPLACE позволяется, данные реорганизовываются существенно, таким образом, это - все еще дорогая работа.
Сделайте столбец NULL Да Да Да Да Хотя ALGORITHM=INPLACE позволяется, данные реорганизовываются существенно, таким образом, это - все еще дорогая работа.
Сделайте столбец NOT NULL Yes* Да Да Да Когда SQL_MODE включает strict_all_tables или strict_all_tables, работа перестала работать, если столбец содержит кого-либо, обнуляет. Хотя ALGORITHM=INPLACE позволяется, данные реорганизовываются существенно, таким образом, это - все еще дорогая работа.
Измените тип данных столбца Нет Да Нет Да
Добавьте первичный ключ Yes* Да Да Да Хотя ALGORITHM=INPLACE позволяется, данные реорганизовываются существенно, таким образом, это - все еще дорогая работа. ALGORITHM=INPLACE не позволяется при определенных условиях, если столбцы должны быть преобразованы в NOT NULL. См. Пример 5.9, "Создавая и Отбрасывая Первичный ключ".
Отбросьте первичный ключ и добавьте другого Да Да Да Да ALGORITHM=INPLACE только позволяется, когда Вы добавляете новый первичный ключ в том же самом ALTER TABLE; данные реорганизовываются существенно, таким образом, это - все еще дорогая работа.
Отбросьте первичный ключ Нет Да Нет Да Ограничения применяются, когда Вы отбрасываете первичный ключ первичного ключа, не добавляя новый в том же самом ALTER TABLE оператор.
Преобразуйте набор символов Нет Да Нет Да Восстанавливает таблицу, если новая кодировка символов отличается.
Определите набор символов Нет Да Нет Да Восстанавливает таблицу, если новая кодировка символов отличается.
Восстановите с FORCE опция Нет Да Нет Да Законы как ALGORITHM=COPY пункт или установкаold_alter_table=1.

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

Вторичный Индексирует

Создание и отбрасывание вторичного индексируют на InnoDB таблицы пропускают копирующее таблицу поведение, то же самое как в MySQL 5.5 и MySQL 5.1 с InnoDB Плагин.

В MySQL 5.6 и выше, таблица остается доступной для операций чтения и операций записи, в то время как индексирование создается или отбрасывается. CREATE INDEX или DROP INDEX оператор только заканчивается после того, как все транзакции, которые получают доступ к таблице, завершаются, так, чтобы начальное состояние индексирования отразило новое содержание таблицы. Ранее, изменение таблицы, в то время как индексирование создавалось или отбрасывалось обычно, приводило к мертвой блокировке, которая отменяла INSERT, UPDATE, или DELETE оператор на таблице.

Свойства столбца

Внешние ключи

Если внешние ключи уже присутствуют в измененной таблице (то есть, это - дочерняя таблица, содержащая любого FOREIGN KEY ... REFERENCE пункты), дополнительные ограничения применяются к онлайновым операциям DDL, даже те, которые не непосредственно включают столбцы внешнего ключа:

Таким же образом, если таблица является родительской таблицей в отношении внешнего ключа, даже при том, что это не содержит никого FOREIGN KEY пункты, это могло ожидать ALTER TABLE завершаться если INSERT, UPDATE, или DELETE оператор, вызванный ON UPDATE или ON DELETE действие в дочерней таблице.

Примечания по ALGORITHM=COPY

Любой ALTER TABLE работа, выполненная с ALGORITHM=COPY пункт предотвращает параллельные операции DML. Параллельные запросы все еще позволяются. Таким образом, копирующая таблицу работа всегда включает, по крайней мере, ограничения параллелизма LOCK=SHARED (позвольте запросы, но не DML). Можно далее ограничить параллелизм для таких операций, определяя LOCK=EXCLUSIVE (предотвратите DML и запросы).

Параллельный DML, но Табличная Копия, Все еще Необходимая

Некоторый другой ALTER TABLE операции позволяют параллельный DML, и являются быстрее чем MySQL 5.5 и предшествующими: копирующая таблицу работа оптимизируется, даже при том, что табличная копия все еще требуется:

Отметить

Поскольку Ваша схема базы данных развивается с новыми столбцами, типами данных, ограничениями, индексирует, и так далее, сохраните Ваш CREATE TABLE операторы, современные с последними табличными определениями. Даже с улучшениями производительности онлайнового DDL, более эффективно создать устойчивые структуры базы данных вначале, вместо того, чтобы создать часть схемы и затем выйти ALTER TABLE операторы позже.

Основное исключение к этой направляющей линии для вторичного, индексирует на таблицах с большими количествами строк. Является обычно самым эффективным составить таблицу со всеми деталями, определенными кроме вторичного устройства, индексирует, загрузите данные, затем создайте вторичное устройство, индексирует. Можно использовать тот же самый метод с внешними ключами (загрузите данные сначала, затем установите внешние ключи), если Вы знаете, что исходные данные чисты, и не нуждаются в проверках непротиворечивости во время процесса загрузки.

Безотносительно последовательности CREATE TABLE, CREATE INDEX, ALTER TABLE, и подобные операторы вошли в соединение таблицы, можно получить SQL, должен был восстановить текущую форму таблицы, делая заявление SHOW CREATE TABLE table\G (верхний регистр \G требуемый для опрятного форматирования). Этот вывод показывает пункты, такие как числовая точность, NOT NULL, и CHARACTER SET это иногда добавляется негласно, и Вы могли бы иначе не учесть, клонируя таблицу на новой системе или устанавливая столбцы внешнего ключа с идентичным типом.