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=COPYMySQL преобразует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 9.2.При добавлении столбца с помощью алгоритма
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. Максимальное количество версий строк, разрешенных в MySQL 9.1.0 и более поздних версиях, равно 255, так как каждая версия строки требует дополнительного места для метаданных таблицы. При достижении предела версий строк операции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 9.2.При удалении столбца с помощью алгоритма
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. Максимальное количество версий строк, разрешенных в MySQL 9.1.0 и более поздних версиях, равно 255, так как каждая версия строки требует дополнительного места для метаданных таблицы. При достижении предела версий строк операции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, «Настройка постоянных статистических данных оптимизатора».
Операции с табличными пространствами
В следующей таблице представлен обзор поддержки онлайн-DDL для операций с табличными пространствами. Подробности см. в разделе Примечания по синтаксису и использованию.
Таблица 17.21 Поддержка онлайн-DDL для операций с табличными пространствами
| Операция | Мгновенно | На месте | Перестраивает таблицу | Разрешает параллельный DML | Только изменяет метаданные |
|---|---|---|---|---|---|
| Переименование общего табличного пространства | Нет | Да | Нет | Да | Да |
| Включение или отключение шифрования общего табличного пространства | Нет | Да | Нет | Да | Нет |
| Включение или отключение шифрования табличного пространства file-per-table | Нет | Нет | Да | Нет | Нет |
Примечания по синтаксису и использованию
-
Переименование общего табличного пространства
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 в состоянии покоя».
-
Включение или отключение шифрования табличного пространства file-per-table
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.