17.12.1 Операции DDL в режиме онлайн
Подробная информация о поддержке операций DDL в режиме онлайн, примеры синтаксиса и заметки по использованию приведены в следующих разделах этого раздела.
Операции с индексами
В следующей таблице представлен обзор поддержки операций DDL в режиме онлайн для операций с индексами. Звездочка (*) указывает дополнительную информацию, исключение или зависимость. Подробности см. в разделе Примечания к синтаксису и использованию.
Таблица 17.15 Поддержка DDL в режиме онлайн для операций с индексами
| Операция | Мгновенно | На месте | Перестраивает таблицу | Разрешает одновременную DML | Только изменяет метаданные |
|---|---|---|---|---|---|
| Создание или добавление вторичного индекса | Нет | Да | Нет | Да | Нет |
| Удаление индекса | Нет | Да | Нет | Да | Да |
| Переименование индекса | Нет | Да | Нет | Да | Да |
Добавление FULLTEXT индекса | Нет | Да* | Нет* | Нет | Нет |
Добавление SPATIAL индекса | Нет | Да | Нет | Нет | Нет |
| Изменение типа индекса | Да | Да | Нет | Да | Да |
Примечания к синтаксису и использованию
-
Создание или добавление вторичного индекса
CREATE INDEX
nameONtable(col_list);ALTER TABLE
tbl_nameADD INDEXname(col_list);Таблица остается доступной для операций чтения и записи во время создания индекса. Выполнение оператора
CREATE INDEXзавершается только после завершения всех транзакций, которые обращаются к таблице, чтобы начальное состояние индекса отражало наиболее последние данные таблицы.Поддержка операций DDL в режиме онлайн для добавления вторичных индексов означает, что вы, как правило, можете ускорить весь процесс создания и загрузки таблицы и связанных индексов, создав таблицу без вторичных индексов, а затем добавив вторичные индексы после загрузки данных.
Новый вторичный индекс содержит только данные, подтвержденные в таблице на момент завершения выполнения оператора
CREATE INDEXилиALTER TABLE. Он не содержит не подтвержденных значений, старых версий значений или значений, помеченных на удаление, но еще не удаленных из старого индекса.Некоторые факторы влияют на производительность, использование памяти и семантику этой операции. Подробности см. в разделе Раздел 17.12.8, «Ограничения DDL в режиме онлайн».
-
Удаление индекса
DROP INDEX
nameONtable;ALTER TABLE
tbl_nameDROP INDEXname;Таблица остается доступной для операций чтения и записи во время удаления индекса. Оператор
DROP INDEXзавершается только после того, как будут завершены все транзакции, обращающиеся к таблице, чтобы начальное состояние индекса отражало самые последние данные таблицы. -
Переименование индекса
ALTER TABLE
tbl_nameRENAME INDEXold_index_nameTOnew_index_name, ALGORITHM=INPLACE, LOCK=NONE; -
Добавление
FULLTEXTиндексаCREATE FULLTEXT INDEX
nameON table(column);Добавление первого
FULLTEXTиндекса перестраивает таблицу, если нет столбца, определенного пользователем,FTS_DOC_ID. ДополнительныеFULLTEXTиндексы могут быть добавлены без перестройки таблицы. -
Добавление
SPATIALиндексаCREATE TABLE geom (g GEOMETRY NOT NULL); ALTER TABLE geom ADD SPATIAL INDEX(g), ALGORITHM=INPLACE, LOCK=SHARED;
-
Изменение типа индекса (
USING {BTREE | HASH})ALTER TABLE
tbl_nameDROP INDEX i1, ADD INDEX i1(key_part,...) USING BTREE, ALGORITHM=INSTANT;
Операции с первичными ключами
В следующей таблице представлен обзор поддержки онлайн DDL для операций с первичными ключами. Звездочка указывает на дополнительную информацию, исключение или зависимость. См. Примечания по синтаксису и использованию.
Таблица 17.16 Поддержка онлайн DDL для операций с первичными ключами
| Операция | Мгновенно | На месте | Перестраивает таблицу | Допускает одновременную DML | Изменяет только метаданные |
|---|---|---|---|---|---|
| Добавление первичного ключа | Нет | Да* | Да* | Да | Нет |
| Удаление первичного ключа | Нет | Нет | Да | Нет | Нет |
| Удаление первичного ключа и добавление другого | Нет | Да | Да | Да | Нет |
Примечания по синтаксису и использованию
-
Добавление первичного ключа
ALTER TABLE
tbl_nameADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE;Перестраивает таблицу на месте. Данные существенно переупорядочиваются, что делает эту операцию дорогостоящей.
ALGORITHM=INPLACEне разрешается при определенных условиях, если столбцы необходимо преобразовать вNOT NULL.Перестройка всегда требует копирования данных таблицы. Поэтому лучше определить первичный ключ при создании таблицы, а не выполнять
ALTER TABLE ... ADD PRIMARY KEYпозже.При создании
UNIQUEилиPRIMARY KEYиндекса MySQL выполняет дополнительные действия. ДляUNIQUEиндексов MySQL проверяет, что таблица не содержит дублирующих значений для ключа. ДляPRIMARY KEYиндекса MySQL также проверяет, что ни один из столбцовPRIMARY KEYне содержитNULL.При добавлении первичного ключа с помощью предложения
ALGORITHM=COPY, MySQL преобразуетNULLзначения в связанных столбцах в значения по умолчанию: 0 для чисел, пустую строку для столбцов на основе символов и BLOB, и 0000-00-00 00:00:00 дляDATETIME. Это нестандартное поведение, от которого Oracle рекомендует воздержаться.Добавление первичного ключа с использованием
ALGORITHM=INPLACEразрешается только в том случае, если значение параметраSQL_MODEвключает флагиstrict_trans_tablesилиstrict_all_tables; когда значениеSQL_MODEстрогое,ALGORITHM=INPLACEразрешается, но операция может быть прервана, если столбцы запрошенного первичного ключа содержатNULLзначения. ПоведениеALGORITHM=INPLACEболее соответствует стандартам.Если вы создаёте таблицу без первичного ключа, MySQL выбирает его за вас, что может быть первым
UNIQUEключом, определённым вNOT NULLстолбцах, или сгенерированным системой ключом. Чтобы избежать неопределённости и потенциальной потребности в дополнительном скрытом столбце, укажите предложениеPRIMARY KEYкак часть оператораCREATE TABLE.MySQL создаёт новый кластеризованный индекс, копируя существующие данные из исходной таблицы в временную таблицу с требуемой структурой индекса. После полного копирования данных во временную таблицу исходная таблица переименовывается с другим именем временной таблицы. Временная таблица, содержащая новый кластеризованный индекс, переименовывается в имя исходной таблицы, а исходная таблица удаляется из базы данных.
Онлайн-улучшения производительности, которые применяются к операциям со вторичными индексами, не применяются к индексу первичного ключа. Строки таблицы InnoDB хранятся в структуре, организованной на основе первичного ключа, образуя то, что некоторые системы баз данных называют «таблицей с индексированной организацией». Поскольку структура таблицы тесно связана с первичным ключом, переопределение первичного ключа по-прежнему требует копирования данных.
Когда операция с первичным ключом использует
ALGORITHM=INPLACE, даже если данные всё ещё копируются, это более эффективно, чем использованиеALGORITHM=COPY, потому что:Для
ALGORITHM=INPLACEне требуется журналирование отката или соответствующее журналирование повтора. Эти операции добавляют нагрузку к операторам DDL, которые используютALGORITHM=COPY.Записи вторичного индекса предварительно отсортированы, поэтому их можно загружать по порядку.
Буфер изменений не используется, поскольку случайных вставок в вторичные индексы нет.
-
Удаление первичного ключа
ALTER TABLE
tbl_nameDROP PRIMARY KEY, ALGORITHM=COPY;Только
ALGORITHM=COPYподдерживает удаление первичного ключа без добавления нового в том жеALTER TABLEоператоре. -
Удаление первичного ключа и добавление другого
ALTER TABLE
tbl_nameDROP PRIMARY KEY, ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE;Данные существенно переупорядочиваются, что делает эту операцию дорогостоящей.
Операции со столбцами
В следующей таблице представлен обзор поддержки онлайн DDL для операций со столбцами. Звездочка указывает на дополнительную информацию, исключение или зависимость. Для получения подробностей см. Примечания по синтаксису и использованию.
Таблица 17.17 Поддержка онлайн DDL для операций со столбцами
| Операция | Мгновенно | На месте | Перестраивает таблицу | Допускает одновременную DML | Изменяет только метаданные |
|---|---|---|---|---|---|
| Добавление столбца | Да* | Да | Нет* | Да* | Да |
| Удаление столбца | Да* | Да | Да | Да | Да |
| Переименование столбца | Да* | Да | Нет | Да* | Да |
| Переупорядочивание столбцов | Нет | Да | Да | Да | Нет |
| Установка значения по умолчанию столбца | Да | Да | Нет | Да | Да |
| Изменение типа данных столбца | Нет | Нет | Да | Нет | Нет |
Расширение размера столбца VARCHAR | Нет | Да | Нет | Да | Да |
| Удаление значения по умолчанию столбца | Да | Да | Нет | Да | Да |
| Изменение значения автоинкремента | Нет | Да | Нет | Да | Нет* |
Сделать столбец NULL
| Нет | Да | Да* | Да | Нет |
Сделать столбец NOT NULL
| Нет | Да* | Да* | Да | Нет |
Изменение определения столбца ENUM или SET | Да | Да | Нет | Да | Да |
Примечания по синтаксису и использованию
-
Добавление столбца
ALTER TABLE
tbl_nameADD COLUMNcolumn_namecolumn_definition, ALGORITHM=INSTANT;INSTANT— это алгоритм по умолчанию в MySQL 8.4.При добавлении столбца с помощью алгоритма
INSTANTприменяются следующие ограничения:Операция добавления столбца не может быть объединена в одном операторе с другими операциями, которые не поддерживают алгоритм
INSTANT.Алгоритм
INSTANTможет добавлять столбец в любое положение таблицы.Столбцы нельзя добавлять в таблицы, использующие
ROW_FORMAT=COMPRESSED, таблицы с индексомFULLTEXT, таблицы, находящиеся в табличном пространстве словаря данных, или временные таблицы. Временные таблицы поддерживают толькоALGORITHM=COPY.-
При добавлении столбца с помощью алгоритма
INSTANTMySQL проверяет размер строки и выдает следующую ошибку, если добавление превышает предел.Ошибка 4092 (HY000): Столбец не может быть добавлен с ALGORITHM=INSTANT, так как после этого максимальный возможный размер строки превысит максимально допустимый размер строки. Попробуйте ALGORITHM=INPLACE/COPY.
-
Максимальное количество столбцов во внутренней представлении таблицы не может превышать 1022 после добавления столбца с помощью алгоритма
INSTANT. Сообщение об ошибке:Ошибка 4158 (HY000): Столбец не может быть добавлен к
tbl_nameс ALGORITHM=INSTANT. Пожалуйста, попробуйте ALGORITHM=INPLACE/COPY Алгоритм
INSTANTне может добавлять или удалять столбцы в системные таблицы схемы, такие как внутренняя таблицаmysql.Столбец с функциональным индексом не может быть удален с использованием алгоритма
INSTANT.
В одном операторе
ALTER TABLEможно добавить несколько столбцов. Например:ALTER TABLE t1 ADD COLUMN c2 INT, ADD COLUMN c3 INT, ALGORITHM=INSTANT;
После каждой операции
ALTER TABLE ... ALGORITHM=INSTANT, добавляющей один или несколько столбцов, удаляющей один или несколько столбцов, или добавляющей и удаляющей один или несколько столбцов в одной операции, создается новая версия строки. СтолбецINFORMATION_SCHEMA.INNODB_TABLES.TOTAL_ROW_VERSIONSотслеживает количество версий строк для таблицы. Значение увеличивается каждый раз, когда столбец добавляется или удаляется мгновенно. Начальное значение равно 0.mysql> SELECT NAME, TOTAL_ROW_VERSIONS FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME LIKE 'test/t1'; +---------+--------------------+ | NAME | TOTAL_ROW_VERSIONS | +---------+--------------------+ | test/t1 | 0 | +---------+--------------------+При перестроении таблицы с мгновенно добавленными или удаленными столбцами операцией перестроения таблицы
ALTER TABLEилиOPTIMIZE TABLEзначениеTOTAL_ROW_VERSIONSсбрасывается до 0. Максимальное количество разрешенных версий строк равно 64 (255 с MySQL 9.1.0), так как каждая версия строки требует дополнительного места для метаданных таблицы. При достижении предела версий строк операцииADD COLUMNиDROP COLUMNс использованиемALGORITHM=INSTANTотклоняются с сообщением об ошибке, рекомендующим перестроить таблицу с использованием алгоритмаCOPYилиINPLACE.Ошибка 4080 (HY000): Достигнуто максимальное количество версий строк для таблицы test/t1. Больше столбцов нельзя добавлять или удалять мгновенно. Используйте COPY/INPLACE.
Следующие столбцы
INFORMATION_SCHEMAпредоставляют дополнительные метаданные для мгновенно добавленных столбцов. Дополнительную информацию см. в описаниях этих столбцов. См. Раздел 28.4.9, «Таблица INFORMATION_SCHEMA INNODB_COLUMNS» и Раздел 28.4.23, «Таблица INFORMATION_SCHEMA INNODB_TABLES».INNODB_COLUMNS.DEFAULT_VALUEINNODB_COLUMNS.HAS_DEFAULTINNODB_TABLES.INSTANT_COLS
Одновременные DML-операции запрещены при добавлении столбца. Данные существенно переупорядочиваются, что делает операцию дорогостоящей. Минимально требуется
ALGORITHM=INPLACE, LOCK=SHARED.Таблица перестраивается, если используется
ALGORITHM=INPLACEдля добавления столбца. -
Удаление столбца
ALTER TABLE
tbl_nameDROP COLUMNcolumn_name, ALGORITHM=INSTANT;INSTANT— это алгоритм по умолчанию в MySQL 8.4.При использовании алгоритма
INSTANTдля удаления столбца применяются следующие ограничения:Удаление столбца не может быть объединено в одном операторе с другими операциями
ALTER TABLE, которые не поддерживаютALGORITHM=INSTANT.Столбцы нельзя удалять из таблиц, использующих
ROW_FORMAT=COMPRESSED, таблиц с индексомFULLTEXT, таблиц, находящихся в табличном пространстве словаря данных, или временных таблиц. Временные таблицы поддерживают толькоALGORITHM=COPY.
В одном операторе
ALTER TABLEможно удалить несколько столбцов, например:ALTER TABLE t1 DROP COLUMN c4, DROP COLUMN c5, ALGORITHM=INSTANT;
При каждом добавлении или удалении столбца с помощью
ALGORITHM=INSTANTсоздается новая версия строки. СтолбецINFORMATION_SCHEMA.INNODB_TABLES.TOTAL_ROW_VERSIONSотслеживает количество версий строк для таблицы. Значение увеличивается каждый раз, когда столбец добавляется или удаляется мгновенно. Начальное значение равно 0.mysql> SELECT NAME, TOTAL_ROW_VERSIONS FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME LIKE 'test/t1'; +---------+--------------------+ | NAME | TOTAL_ROW_VERSIONS | +---------+--------------------+ | test/t1 | 0 | +---------+--------------------+При перестроении таблицы с мгновенно добавленными или удаленными столбцами операцией перестроения таблицы
ALTER TABLEилиOPTIMIZE TABLEзначениеTOTAL_ROW_VERSIONSсбрасывается до 0. Максимальное количество разрешенных версий строк равно 64 (255 с MySQL 9.1.0), так как каждая версия строки требует дополнительного места для метаданных таблицы. При достижении предела версий строк операцииADD COLUMNиDROP COLUMNс использованиемALGORITHM=INSTANTотклоняются с сообщением об ошибке, рекомендующим перестроить таблицу с использованием алгоритмаCOPYилиINPLACE.Ошибка 4080 (HY000): Достигнуто максимальное количество версий строк для таблицы test/t1. Больше столбцов нельзя добавлять или удалять мгновенно. Используйте COPY/INPLACE.
Если используется алгоритм, отличный от
ALGORITHM=INSTANT, данные существенно переупорядочиваются, что делает операцию дорогостоящей. -
Переименование столбца
ALTER TABLE
tblCHANGEold_col_namenew_col_namedata_type, ALGORITHM=INSTANT;Для поддержки одновременных DML-операций сохраните тот же тип данных и измените только имя столбца.
При сохранении того же типа данных и атрибута
[NOT] NULL, изменяя только имя столбца, операция всегда может выполняться онлайн.Переименование столбца, на который ссылается другая таблица, разрешено только с
ALGORITHM=INPLACE. Если вы используетеALGORITHM=INSTANT,ALGORITHM=COPYили другие условия, которые приводят к использованию этих алгоритмов, операторALTER TABLEзавершается ошибкой.ALGORITHM=INSTANTподдерживает переименование виртуального столбца, в то время какALGORITHM=INPLACE— нет.ALGORITHM=INSTANTиALGORITHM=INPLACEне поддерживают переименование столбца при добавлении или удалении виртуального столбца в одном операторе. В этом случае поддерживается толькоALGORITHM=COPY. -
Переупорядочение столбцов
Для переупорядочения столбцов используйте
FIRSTилиAFTERв операцияхCHANGEилиMODIFY.ALTER TABLE
tbl_nameMODIFY COLUMNcol_namecolumn_definitionFIRST, ALGORITHM=INPLACE, LOCK=NONE;Данные существенно переупорядочиваются, что делает операцию дорогостоящей.
-
Изменение типа данных столбца
ALTER TABLE
tbl_nameCHANGE c1 c1 BIGINT, ALGORITHM=COPY;Изменение типа данных столбца поддерживается только с помощью
ALGORITHM=COPY. -
Расширение размера столбца
VARCHARALTER TABLE
tbl_nameCHANGE COLUMN c1 c1 VARCHAR(255), ALGORITHM=INPLACE, LOCK=NONE;Количество байтов длины, требуемых для столбца
VARCHAR, должно оставаться неизменным. Для столбцовVARCHARразмером от 0 до 255 байтов требуется один байт длины для кодирования значения. Для столбцовVARCHARразмером 256 байтов или больше требуется два байта длины. В результате, локальное изменениеALTER TABLEподдерживает только увеличение размера столбцаVARCHARс 0 до 255 байтов или с 256 байтов до большего размера. Локальное изменениеALTER TABLEне поддерживает увеличение размера столбцаVARCHARс меньше чем 256 байтов до размера, равного или большего 256 байтов. В этом случае количество требуемых байтов длины изменяется с 1 на 2, что поддерживается только копированием таблицы (ALGORITHM=COPY). Например, попытка изменить размер столбцаVARCHARдля набора символов с одним байтом с VARCHAR(255) на VARCHAR(256) с локальным изменениемALTER TABLEвозвращает следующую ошибку:ALTER TABLE
tbl_nameALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(256); ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.ПримечаниеДлина в байтах столбца
VARCHARзависит от длины набора символов в байтах.Уменьшение размера столбца
VARCHARс использованием локального измененияALTER TABLEне поддерживается. Уменьшение размера столбцаVARCHARтребует копирования таблицы (ALGORITHM=COPY).
-
Установка значения по умолчанию для столбца
ALTER TABLE
tbl_nameALTER COLUMNcolSET DEFAULTliteral, ALGORITHM=INSTANT;Изменяет только метаданные таблицы. Значения столбцов по умолчанию хранятся в .
-
Удаление значения по умолчанию для столбца
ALTER TABLE
tblALTER COLUMNcolDROP DEFAULT, ALGORITHM=INSTANT; -
Изменение значения автоинкремента
ALTER TABLE
tableAUTO_INCREMENT=next_value, ALGORITHM=INPLACE, LOCK=NONE;Изменяет значение, хранящееся в памяти, а не в файле данных.
В распределённой системе с репликацией или фрагментацией иногда необходимо сбросить счётчик автоинкремента таблицы до определённого значения. Следующая строка, вставленная в таблицу, будет использовать указанное значение для столбца автоинкремента. Такую технику можно использовать также в среде хранилища данных, где таблицы периодически очищаются и перезагружаются, а последовательность автоинкремента перезапускается с 1.
-
Преобразование столбца в
NULLALTER TABLE tbl_name MODIFY COLUMN
column_namedata_typeNULL, ALGORITHM=INPLACE, LOCK=NONE;Перестраивает таблицу на месте. Данные существенно переупорядочиваются, что делает операцию дорогостоящей.
-
Преобразование столбца в
NOT NULLALTER TABLE
tbl_nameMODIFY COLUMNcolumn_namedata_typeNOT NULL, ALGORITHM=INPLACE, LOCK=NONE;Перестраивает таблицу на месте.
STRICT_ALL_TABLESилиSTRICT_TRANS_TABLESSQL_MODEтребуется для успешного выполнения операции. Операция завершается неудачно, если столбец содержит значения NULL. Сервер запрещает изменения столбцов с внешним ключом, которые могут привести к потере целостности ссылок. См. Раздел 15.1.9, «Операция ALTER TABLE». Данные существенно переупорядочиваются, что делает операцию дорогостоящей. -
Изменение определения столбца
ENUMилиSETCREATE TABLE t1 (c1 ENUM('a', 'b', 'c')); ALTER TABLE t1 MODIFY COLUMN c1 ENUM('a', 'b', 'c', 'd'), ALGORITHM=INSTANT;Изменение определения столбца
ENUMилиSETпутём добавления новых элементов перечисления или множества в конец списка допустимых значений может выполняться мгновенно или на месте, пока размер хранилища типа данных не изменится. Например, добавление элемента в столбецSET, имеющий 8 элементов, изменяет требуемый размер хранилища на значение с 1 байта до 2 байт; это требует копирования таблицы. Добавление элементов в середину списка приводит к переиндексации существующих элементов, что требует копирования таблицы.
Операции над столбцами сгенерированными значениями
В следующей таблице представлен обзор поддержки онлайн DDL для операций над столбцами сгенерированными значениями. Подробную информацию см. в Разделе о синтаксисе и примечаниях к использованию.
Таблица 17.18 Поддержка онлайн DDL для операций над столбцами сгенерированными значениями
| Операция | Мгновенно | На месте | Перестраивает таблицу | Допускает одновременные операции DML | Изменяет только метаданные |
|---|---|---|---|---|---|
Добавление столбца STORED | Нет | Нет | Да | Нет | Нет |
Изменение порядка столбцов STORED | Нет | Нет | Да | Нет | Нет |
Удаление столбца STORED | Нет | Да | Да | Да | Нет |
Добавление столбца VIRTUAL | Да | Да | Нет | Да | Да |
Изменение порядка столбцов VIRTUAL | Нет | Нет | Да | Нет | Нет |
Удаление столбца VIRTUAL | Да | Да | Нет | Да | Да |
Примечания к синтаксису и использованию
-
Добавление столбца
STOREDALTER TABLE t1 ADD COLUMN (c2 INT GENERATED ALWAYS AS (c1 + 1) STORED), ALGORITHM=COPY;
ADD COLUMNне является операцией на месте для хранимых столбцов (выполняется без временной таблицы), потому что выражение должно быть вычислено сервером. -
Изменение порядка столбцов
STOREDALTER TABLE t1 MODIFY COLUMN c2 INT GENERATED ALWAYS AS (c1 + 1) STORED FIRST, ALGORITHM=COPY;
Перестраивает таблицу на месте.
-
Удаление столбца
STOREDALTER TABLE t1 DROP COLUMN c2, ALGORITHM=INPLACE, LOCK=NONE;
Перестраивает таблицу на месте.
-
Добавление столбца
VIRTUALALTER TABLE t1 ADD COLUMN (c2 INT GENERATED ALWAYS AS (c1 + 1) VIRTUAL), ALGORITHM=INSTANT;
Добавление виртуального столбца может выполняться мгновенно или на месте для таблиц без разделения.
Добавление
VIRTUALне является операцией на месте для разделяемых таблиц. -
Изменение порядка столбцов
VIRTUALALTER TABLE t1 MODIFY COLUMN c2 INT GENERATED ALWAYS AS (c1 + 1) VIRTUAL FIRST, ALGORITHM=COPY;
-
Удаление столбца
VIRTUALALTER TABLE t1 DROP COLUMN c2, ALGORITHM=INSTANT;
Удаление столбца
VIRTUALможет выполняться мгновенно или на месте для таблиц без разделения.
Операции с внешними ключами
В следующей таблице представлен обзор поддержки онлайн DDL для операций с внешними ключами. Звёздочка указывает дополнительную информацию, исключение или зависимость. Подробную информацию см. в Разделе о синтаксисе и примечаниях к использованию.
Таблица 17.19 Поддержка онлайн DDL для операций с внешними ключами
| Операция | Мгновенно | На месте | Перестраивает таблицу | Допускает одновременные операции DML | Изменяет только метаданные |
|---|---|---|---|---|---|
| Добавление ограничения внешнего ключа | Нет | Да* | Нет | Да | Да |
| Удаление ограничения внешнего ключа | Нет | Да | Нет | Да | Да |
Примечания к синтаксису и использованию
-
Добавление ограничения внешнего ключа
Алгоритм
INPLACEподдерживается, когдаforeign_key_checksотключен. В противном случае поддерживается только алгоритмCOPY.ALTER TABLE
tbl1ADD CONSTRAINTfk_nameFOREIGN KEYindex(col1) REFERENCEStbl2(col2)referential_actions; -
Удаление ограничения внешнего ключа
ALTER TABLE
tblDROP FOREIGN KEYfk_name;Удаление внешнего ключа может выполняться онлайн с параметром
foreign_key_checksвключённым или выключенным.Если вам не известны имена ограничений внешних ключей для определённой таблицы, выполните следующую команду и найдите имя ограничения в фрагменте
CONSTRAINTдля каждого внешнего ключа:SHOW CREATE TABLE
table\GИли запросите таблицу схемы информации
TABLE_CONSTRAINTSи используйте столбцыCONSTRAINT_NAMEиCONSTRAINT_TYPEдля идентификации имён внешних ключей.Также можно удалить внешний ключ и связанный с ним индекс в одной команде:
ALTER TABLE
tableDROP FOREIGN KEYconstraint, DROP INDEXindex;
Если уже присутствуют в таблице, которая изменяется (т. е. это содержащая фрагмент FOREIGN KEY ... REFERENCE), к операциям онлайн DDL, даже тем, которые не напрямую связаны со столбцами внешнего ключа, применяются дополнительные ограничения:
Операция
ALTER TABLEнад дочерней таблицей может ожидать завершения другой транзакции, если изменение родительской таблицы вызывает связанные изменения в дочерней таблице через фрагментON UPDATEилиON DELETE, использующий параметрыCASCADEилиSET NULL.Аналогично, если таблица является в отношениях внешних ключей, даже если она не содержит фрагментов
FOREIGN KEY, она может ожидать завершения операцииALTER TABLE, если операцияINSERT,UPDATEилиDELETEвызывает действиеON UPDATEилиON DELETEв дочерней таблице.
Операции с таблицами
В следующей таблице представлен обзор поддержки онлайн DDL для операций с таблицами. Звездочка (*) указывает на дополнительную информацию, исключение или зависимость. Для получения подробностей см. Примечания к синтаксису и использованию.
Таблица 17.20 Поддержка онлайн DDL для операций с таблицами
| Операция | Мгновенно | На месте | Перестраивает таблицу | Разрешает одновременные операции DML | Только изменяет метаданные |
|---|---|---|---|---|---|
Изменение ROW_FORMAT | Нет | Да | Да | Да | Нет |
Изменение KEY_BLOCK_SIZE | Нет | Да | Да | Да | Нет |
| Установка постоянных статистических данных таблицы | Нет | Да | Нет | Да | Да |
| Указание кодовой страницы | Нет | Да | Да* | Да | Нет |
| Преобразование кодовой страницы | Нет | Нет | Да* | Нет | Нет |
| Оптимизация таблицы | Нет | Да* | Да | Да | Нет |
Перестройка с опцией FORCE | Нет | Да* | Да | Да | Нет |
| Выполнение нулевой перестройки | Нет | Да* | Да | Да | Нет |
| Переименование таблицы | Да | Да | Нет | Да | Да |
Примечания к синтаксису и использованию
-
Изменение
ROW_FORMATALTER TABLE
tbl_nameROW_FORMAT =row_format, ALGORITHM=INPLACE, LOCK=NONE;Данные существенно переупорядочиваются, что делает операцию дорогостоящей.
Дополнительную информацию об опции
ROW_FORMATсм. в разделе Параметры таблицы. -
Изменение
KEY_BLOCK_SIZEALTER TABLE
tbl_nameKEY_BLOCK_SIZE =value, ALGORITHM=INPLACE, LOCK=NONE;Данные существенно переупорядочиваются, что делает операцию дорогостоящей.
Дополнительную информацию об опции
KEY_BLOCK_SIZEсм. в разделе Параметры таблицы. -
Установка параметров постоянных статистических данных таблицы
ALTER TABLE
tbl_nameSTATS_PERSISTENT=0, STATS_SAMPLE_PAGES=20, STATS_AUTO_RECALC=1, ALGORITHM=INPLACE, LOCK=NONE;Изменяет только метаданные таблицы.
Постоянные статистики включают
STATS_PERSISTENT,STATS_AUTO_RECALCиSTATS_SAMPLE_PAGES. Для получения дополнительной информации см. Раздел 17.8.10.1, «Настройка параметров постоянных статистических данных оптимизатора». -
Указание кодовой страницы
ALTER TABLE
tbl_nameCHARACTER SET =charset_name, ALGORITHM=INPLACE, LOCK=NONE;Перестраивает таблицу, если новое кодирование отличается.
-
Преобразование кодовой страницы
ALTER TABLE
tbl_nameCONVERT TO CHARACTER SETcharset_name, ALGORITHM=COPY;Перестраивает таблицу, если новое кодирование отличается.
-
Оптимизация таблицы
OPTIMIZE TABLE
tbl_name;Операция на месте не поддерживается для таблиц с индексами
FULLTEXT. Операция использует алгоритмINPLACE, но синтаксисALGORITHMиLOCKне допускается. -
Перестройка таблицы с опцией
FORCEALTER TABLE
tbl_nameFORCE, ALGORITHM=INPLACE, LOCK=NONE;Использует
ALGORITHM=INPLACEначиная с MySQL 5.6.17.ALGORITHM=INPLACEне поддерживается для таблиц с индексамиFULLTEXT. -
Выполнение «нулевой» перестройки
ALTER TABLE
tbl_nameENGINE=InnoDB, ALGORITHM=INPLACE, LOCK=NONE;Использует
ALGORITHM=INPLACEначиная с MySQL 5.6.17.ALGORITHM=INPLACEне поддерживается для таблиц с индексамиFULLTEXT. -
Переименование таблицы
ALTER TABLE
old_tbl_nameRENAME TOnew_tbl_name, ALGORITHM=INSTANT;Переименование таблицы может выполняться мгновенно или на месте. MySQL переименовывает файлы, соответствующие таблице
tbl_name, без создания копии. (Вы также можете использовать операторRENAME TABLEдля переименования таблиц. См. Раздел 15.1.36, «Оператор RENAME TABLE».) Предоставленные конкретно для переименованной таблицы привилегии не мигрируют в новое имя. Их необходимо изменить вручную.
Операции с табличными пространствами
В следующей таблице представлен обзор поддержки онлайн DDL для операций с табличными пространствами. Для получения подробностей см. Примечания к синтаксису и использованию.
Таблица 17.21 Поддержка онлайн DDL для операций с табличными пространствами
| Операция | Мгновенно | На месте | Перестраивает таблицу | Разрешает одновременные операции DML | Только изменяет метаданные |
|---|---|---|---|---|---|
| Переименование общего табличного пространства | Нет | Да | Нет | Да | Да |
| Включение или отключение шифрования общего табличного пространства | Нет | Да | Нет | Да | Нет |
| Включение или отключение шифрования табличного пространства на основе файла на таблицу | Нет | Нет | Да | Нет | Нет |
Примечания к синтаксису и использованию
-
Переименование общего табличного пространства
ALTER TABLESPACE
tablespace_nameRENAME TOnew_tablespace_name;ALTER TABLESPACE ... RENAME TOиспользует алгоритмINPLACE, но не поддерживает предложениеALGORITHM. -
Включение или отключение шифрования общего табличного пространства
ALTER TABLESPACE
tablespace_nameENCRYPTION='Y';ALTER TABLESPACE ... ENCRYPTIONиспользует алгоритмINPLACE, но не поддерживает предложениеALGORITHM.Для получения дополнительной информации см. Раздел 17.13, «Шифрование данных InnoDB».
-
Включение или отключение шифрования табличного пространства на основе файла на таблицу
ALTER TABLE
tbl_nameENCRYPTION='Y', ALGORITHM=COPY;Для получения дополнительной информации см. Раздел 17.13, «Шифрование данных InnoDB».
Операции с разбиением
За исключением некоторых ALTER
TABLE разделов разбиения, операции онлайн DDL для разнесенных InnoDB таблиц подчиняются тем же правилам, что и для обычных InnoDB таблиц.
Некоторые ALTER TABLE разделы разбиения не проходят через тот же внутренний API онлайн DDL, что и обычные неразнесенные InnoDB таблицы. В результате, онлайн поддержка ALTER
TABLE разделов разбиения варьируется.
В следующей таблице показан онлайн-статус для каждого ALTER TABLE оператора разбиения. Независимо от используемого API онлайн DDL, MySQL пытается минимизировать копирование и блокировку данных, где это возможно.
ALTER TABLE варианты разбиения, которые используют ALGORITHM=COPY или которые позволяют только “ALGORITHM=DEFAULT,
LOCK=DEFAULT”, перераспределяют таблицу с использованием алгоритма COPY. Другими словами, создается новая разнесенная таблица с новой схемой разбиения. Новая созданная таблица включает любые изменения, примененные оператором ALTER TABLE, и данные таблицы копируются в новую структуру таблицы.
Таблица 17.22 Поддержка онлайн DDL для операций с разбиением
| Раздел разбиения | Мгновенно | На месте | Разрешает DML | Примечания |
|---|---|---|---|---|
PARTITION BY | Нет | Нет | Нет | Разрешает ALGORITHM=COPY, LOCK={DEFAULT|SHARED|EXCLUSIVE}
|
ADD PARTITION | Нет | Да* | Да* |
ALGORITHM=INPLACE,
LOCK={DEFAULT|NONE|SHARED|EXCLUSISVE} поддерживается для RANGE и LIST разделов, ALGORITHM=INPLACE,
LOCK={DEFAULT|SHARED|EXCLUSISVE} для HASH и KEY разделов и ALGORITHM=COPY,
LOCK={SHARED|EXCLUSIVE} для всех типов разделов. Не копирует существующие данные для таблиц, разнесенных по RANGE или LIST. Разрешены одновременные запросы с ALGORITHM=COPY для таблиц, разнесенных по HASH или LIST, поскольку MySQL копирует данные, удерживая общую блокировку. |
DROP PARTITION | Нет | Да* | Да* |
|
DISCARD PARTITION | Нет | Нет | Нет | Разрешает только ALGORITHM=DEFAULT, LOCK=DEFAULT
|
IMPORT PARTITION | Нет | Нет | Нет | Разрешает только ALGORITHM=DEFAULT, LOCK=DEFAULT
|
TRUNCATE
PARTITION | Нет | Да | Да | Не копирует существующие данные. Просто удаляет строки; не изменяет определение таблицы или ее разделов. |
COALESCE
PARTITION | Нет | Да* | Нет |
ALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSIVE} поддерживается. |
REORGANIZE
PARTITION | Нет | Да* | Нет |
ALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSIVE} поддерживается. |
EXCHANGE
PARTITION | Нет | Да | Да | |
ANALYZE PARTITION | Нет | Да | Да | |
CHECK PARTITION | Нет | Да | Да | |
OPTIMIZE
PARTITION | Нет | Нет | Нет |
ALGORITHM и LOCK разделы игнорируются. Перестраивает всю таблицу. См. Раздел 26.3.4, “Техническое обслуживание разделов”. |
REBUILD PARTITION | Нет | Да* | Нет |
ALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSIVE} поддерживается. |
REPAIR PARTITION | Нет | Да | Да | |
REMOVE
PARTITIONING | Нет | Нет | Нет | Разрешает ALGORITHM=COPY, LOCK={DEFAULT|SHARED|EXCLUSIVE}
|
Операции онлайн ALTER
TABLE без разбиения на разнесенные таблицы подчиняются тем же правилам, что и обычные таблицы. Однако, ALTER TABLE выполняет операции онлайн на каждом разделе таблицы, что увеличивает нагрузку на системные ресурсы из-за выполнения операций на нескольких разделах.
Дополнительную информацию о ALTER
TABLE разделах разбиения см. в Разделах разбиения и Разделе 15.1.9.1, “Операции ALTER TABLE с разделами”. Информацию о разбиении в целом см. в Главе 26, Разбиение.
© 2025 Oracle
Licensed under the GPLv2 License.