Подтвердить что ты не робот

Производительность MySQL ALTER TABLE ADD COLUMN ПОСЛЕ КОЛОННЫ - на большой таблице

Я хочу использовать следующую команду для добавления столбца в существующую таблицу:

   ALTER TABLE foo ADD COLUMN bar AFTER COLUMN old_column;

Может ли эта опция занимать значительно больше той же команды без опции AFTER COLUMN, как показано ниже?

   ALTER TABLE foo ADD COLUMN bar;

Будет ли первая команда использовать большее количество табличного пространства tmp во время выполнения для выполнения действия?

Контекст: у меня очень большая таблица (подумайте над миллиардом строк), и я хочу добавить дополнительный столбец, используя опцию AFTER COLUMN, но я не хочу, чтобы меня слишком наказывали.

4b9b3361

Ответ 1

В то время как другие ответы полезны в качестве примеров синтаксиса, необходимого для добавления столбцов в таблицу, ответ на реальный вопрос был предоставлен NB:


  • Вы получили бы больше использования процессора, так как записи должны быть сдвинуты.
  • С точки зрения использования памяти - было бы то же самое с опцией AFTER COLUMN и без нее.
  • В большинстве случаев создается таблица tmp. Существуют механизмы MySQL, которые поддерживают горячие изменения схемы (TokuDB), которые не создают таблицу tmp и не тратят кучу ресурсов.
  • Однако, если вы делаете это с MyISAM или InnoDB - я бы сказал, что опция "AFTER COLUMN" займет немного больше времени из-за смещения записи.

    - NB

Ответ 2

Вот что я буду делать:

CREATE TABLE newtable LIKE oldtable;
ALTER TABLE newtable ADD COLUMN columnname INT(10) UNSIGNED NOT NULL DEFAULT 0; 

Я не знаю тип столбца. Я приведу пример с INT. Теперь вы можете указать WHERE, который вы хотите добавить в этот новый столбец. По умолчанию он добавит его в конец, если вы не укажете ключевое слово AFTER, если вы его предоставите, вам нужно будет указать в том порядке, который вы вставляете, иначе вам нужно положить его в конец.

INSERT INTO newtable SELECT field1, field2, field3 /*etc...*/, newcolumn = 0 FROM oldtable; 

ИЛИ, если вы добавили его между столбцами:

# eg: ALTER TABLE newtable ADD COLUMN columnname INT(10) UNSIGNED  NULL AFTER field2; 
INSERT INTO newtable SELECT field1, field2, newcolumn = 0, field3 /*etc...*/ FROM oldtable; 

Вы можете добавить предложение where, если вы хотите сделать это в пакетном режиме.

Как только все записи есть

DROP TABLE oldtable;
RENAME TABLE newtable to oldtable;

Ответ 3

Создайте другую таблицу и измените новую таблицу. (например, Книга Зевса)

И используя ALTER TABLE newtable DISABLE KEYS и ALTER TABLE newtable ENABLE KEYS до и после запроса на вставку, можно сделать это быстрее. (например, ниже)

CREATE TABLE newtable ....;
ALTER TABLE newtable ....;

ALTER TABLE newtable DISABLE KEYS;
INSERT INTO newtable ....;
ALTER TABLE newtable ENABLE KEYS;

DROP TABLE oldtable;