Почему я бы предпочел ALGORITHM = COPY вместо ALGORITHM = INPLACE?

16

С тех пор как в MySQL 5.6 был введен интерактивный DDL, ALTER TABLEкоманда может иметь либо одну, ALGORITHM=INPLACEлибо ALGORITHM=COPYуказанную. Обзор онлайн DDL отмечает , что, по умолчанию, INPLACEиспользуется везде , где это возможно, и предполагает (никогда не вполне изложив его) , что INPLACEалгоритм дешевле , чем COPYодин.

Так какую причину мне нужно было бы указать ALGORITHM=COPYв ALTER TABLEзаявлении?

Марк Эмери
источник
Если вы используете COPY, что происходит с индексами в таблице? Получаете ли вы дефрагментированные индексы из-за того, что новая таблица создается и заполняется с нуля?
Дэйв Пул
Если COPY заполняется с нуля, тогда, хотя это медленный вариант, результирующая таблица может работать лучше из-за дефрагментированных индексов.
Дэйв Пул
@DavePoole Хорошая теория, но я подозреваю, что она неуместна, поскольку OPTIMIZE TABLE(как я полагаю, дефрагментация индексов является большой частью ее назначения ) использует ALGORITHM=INPLACEначиная с MySQL 5.7.4. Так что я думаю , что это так , что, да, COPY делает индексы дефрагментировать, но так жеINPLACE (как - то), сводит на нет его как потенциальное преимущество COPY.
Марк Амери
2
«Таблицы InnoDB, созданные до MySQL 5.6, не поддерживают ALTER TABLE ... ALGORITHM=INPLACEтаблицы, содержащие временные столбцы (DATE, DATETIME или TIMESTAMP) и не были перестроены с использованием ALTER TABLE ... ALGORITHM=COPY« ... Ограничения Online DDL
JSapkota

Ответы:

10

Да, есть случаи, когда вы можете указать COPY, но это будет по другим причинам, кроме производительности.

Важно понимать, что MySQL представил новую функцию - онлайн-обработку DLL в версии 5.6. Это не удаляет автономную обработку. Поэтому необходимо различать эти 2 режима:

  1. Некоторые операции все еще работают только в автономном режиме. См. Таблицу 15.10, « Сводка онлайн-статуса для операций DDL » для получения списка операций DDL, которые могут или не могут быть выполнены на месте.

  2. Операции в оперативном и автономном режимах имеют несколько различное поведение, поэтому вы можете выбрать «старый» по причинам совместимости.

Некоторые примеры (пожалуйста, предложите больше):

  1. InnoDB таблицы , созданные до MySQL 5.6 не поддерживает ALTER TABLE ... ALGORITHM=INPLACEдля таблиц , которые включают в себя временные столбцы ( DATE, DATETIMEили TIMESTAMP) и не были реконструированы с использованием ALTER TABLE ... ALGORITHM=COPY. В этом случае ALTER TABLE ... ALGORITHM=INPLACEоперация возвращает ошибку.

  2. ADD PRIMARY KEYПредложение in COPY modeтихо преобразует NULLзначения по умолчанию для этого типа данных (0 для INT, пустая строка для varchar), тогда IN_PLACEкак не делает этого.

С предложением ALGORITHM = COPY операция завершается успешно, несмотря на наличие значений NULL в столбцах первичного ключа; данные молча меняются, что может вызвать проблемы.

Еще одна причина, чтобы предпочесть COPY :

Операции, для которых вы указываете ALGORITHM = COPY или old_alter_table = 1, чтобы принудительно принудительно копировать таблицу при необходимости для точной обратной совместимости в специализированных сценариях.

Хотя руководство MySQL не говорит о реальных сценариях, вы можете себе представить некоторые из них. Например, разработчик полагался на то, что таблица заблокирована во время ALTER INDEXработы, поэтому таблица доступна только для чтения или полностью заблокирована, и существует процесс, который читает статическую таблицу во время перестроения индекса.

Stoleg
источник
1
Я думаю, что люди также склонны путать ALGORITHM=INPLACEс «это онлайн DDL и не будет блокировать базу данных», когда на самом деле они действительно хотят использовать LOCK=NONE.
Брендан Берд,
2

@ Stoleg, вероятно, имеет лучший ответ, но вот еще один. Это =COPYобоснованное предположение, что разработчики оставили в качестве аварийного люка на случай серьезной ошибки =INLINE. Это позволило бы пользователям продолжать использоватьALTER даже если новая функция не работает.

Я видел такие вещи (в флагах sql_mode,my.cnf настройках и т. Д.) На протяжении многих лет. Цель нового релиза состоит в том, чтобы выявить новую, лучшую функцию.

Флаги оптимизации попадают в эту категорию, но есть еще больше причин зависеть от предыдущих действий - оптимизатор всегда будет иногда «делать это неправильно»; просто слишком много возможностей.

Рик Джеймс
источник
1
Почему вы бы назвали это «escape-люком», а не «обратной совместимостью»? Хотя не может быть большой разницы;)
Стелег
1
Я бы сказал «обратная совместимость», если бы мне нужен был один и тот же код для запуска в обеих версиях. Но тогда я бы беспокоился о том, будет ли новый синтаксис распознан старой версией.
Рик Джеймс
-1

В версиях MySQL, которые поддерживают шифрование табличного пространства InnoDB, при изменении таблицы для добавления шифрования изменение выполняется с использованием алгоритма копирования по необходимости.

nthdesign
источник