С тех пор как в MySQL 5.6 был введен интерактивный DDL, ALTER TABLE
команда может иметь либо одну, ALGORITHM=INPLACE
либо ALGORITHM=COPY
указанную. Обзор онлайн DDL отмечает , что, по умолчанию, INPLACE
используется везде , где это возможно, и предполагает (никогда не вполне изложив его) , что INPLACE
алгоритм дешевле , чем COPY
один.
Так какую причину мне нужно было бы указать ALGORITHM=COPY
в ALTER TABLE
заявлении?
mysql
alter-table
ddl
online-operations
Марк Эмери
источник
источник
OPTIMIZE TABLE
(как я полагаю, дефрагментация индексов является большой частью ее назначения ) используетALGORITHM=INPLACE
начиная с MySQL 5.7.4. Так что я думаю , что это так , что, да,COPY
делает индексы дефрагментировать, но так жеINPLACE
(как - то), сводит на нет его как потенциальное преимуществоCOPY
.ALTER TABLE ... ALGORITHM=INPLACE
таблицы, содержащие временные столбцы (DATE, DATETIME или TIMESTAMP) и не были перестроены с использованиемALTER TABLE ... ALGORITHM=COPY
« ... Ограничения Online DDLОтветы:
Да, есть случаи, когда вы можете указать
COPY
, но это будет по другим причинам, кроме производительности.Важно понимать, что MySQL представил новую функцию - онлайн-обработку DLL в версии 5.6. Это не удаляет автономную обработку. Поэтому необходимо различать эти 2 режима:
Некоторые операции все еще работают только в автономном режиме. См. Таблицу 15.10, « Сводка онлайн-статуса для операций DDL » для получения списка операций DDL, которые могут или не могут быть выполнены на месте.
Операции в оперативном и автономном режимах имеют несколько различное поведение, поэтому вы можете выбрать «старый» по причинам совместимости.
Некоторые примеры (пожалуйста, предложите больше):
InnoDB таблицы , созданные до MySQL 5.6 не поддерживает
ALTER TABLE ... ALGORITHM=INPLACE
для таблиц , которые включают в себя временные столбцы (DATE
,DATETIME
илиTIMESTAMP
) и не были реконструированы с использованиемALTER TABLE ... ALGORITHM=COPY
. В этом случаеALTER TABLE ... ALGORITHM=INPLACE
операция возвращает ошибку.ADD PRIMARY KEY
Предложение inCOPY mode
тихо преобразуетNULL
значения по умолчанию для этого типа данных (0 для INT, пустая строка для varchar), тогдаIN_PLACE
как не делает этого.Еще одна причина, чтобы предпочесть
COPY
:Хотя руководство MySQL не говорит о реальных сценариях, вы можете себе представить некоторые из них. Например, разработчик полагался на то, что таблица заблокирована во время
ALTER INDEX
работы, поэтому таблица доступна только для чтения или полностью заблокирована, и существует процесс, который читает статическую таблицу во время перестроения индекса.источник
ALGORITHM=INPLACE
с «это онлайн DDL и не будет блокировать базу данных», когда на самом деле они действительно хотят использоватьLOCK=NONE
.@ Stoleg, вероятно, имеет лучший ответ, но вот еще один. Это
=COPY
обоснованное предположение, что разработчики оставили в качестве аварийного люка на случай серьезной ошибки=INLINE
. Это позволило бы пользователям продолжать использоватьALTER
даже если новая функция не работает.Я видел такие вещи (в флагах
sql_mode
,my.cnf
настройках и т. Д.) На протяжении многих лет. Цель нового релиза состоит в том, чтобы выявить новую, лучшую функцию.Флаги оптимизации попадают в эту категорию, но есть еще больше причин зависеть от предыдущих действий - оптимизатор всегда будет иногда «делать это неправильно»; просто слишком много возможностей.
источник
В версиях MySQL, которые поддерживают шифрование табличного пространства InnoDB, при изменении таблицы для добавления шифрования изменение выполняется с использованием алгоритма копирования по необходимости.
источник