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

Оптимизировать mySql для быстрого добавления таблицы добавления столбца

У меня есть таблица, содержащая 170 002 225 строк с примерно 35 столбцами и двумя индексами. Я хочу добавить столбец. Команда alter table заняла около 10 часов. Ни один из процессоров не казался занятым в течение этого времени и не ожидал чрезмерного ожидания ввода-вывода. Это на 4-х высокопроизводительной коробке с тоннами памяти.

Это лучшее, что я могу сделать? Есть ли что-то, что я могу рассмотреть, чтобы оптимизировать столбец добавления при настройке db?

4b9b3361

Ответ 1

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

  • Создайте новую таблицу (используя структуру текущей таблицы) с включенным новым столбцом.
  • выполнить INSERT INTO new_table (column1,..columnN) SELECT (column1,..columnN) FROM current_table;
  • переименовать текущую таблицу
  • переименуйте новую таблицу, используя имя текущей таблицы.

Ответ 2

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

Из "Книги высокой производительности MySQL" (ребята из Percona):

Обычный трюк для эффективной загрузки таблицы MyISAM - это отключить ключи, загрузить данные и поменять ключи:

mysql> ALTER TABLE test.load_data DISABLE KEYS;
-- load data
mysql> ALTER TABLE test.load_data ENABLE KEYS;

Ответ 3

Ну, я бы рекомендовал использовать последние Percona MySQL сборки плюс, так как в руководстве по MySQL есть следующее примечание

В других случаях MySQL создает временная таблица, даже если данные строго не нужно будет копировать. Для таблиц MyISAM вы можете ускорить операцию повторного создания индекса (которая является самой медленной частью изменения процесса), установив Система myisam_sort_buffer_size переменной до высокого значения.

Сначала вы можете сделать ALTER TABLE DISABLE KEYS, затем добавить столбец, а затем ALTER TABLE ENABLE KEYS. Я не вижу здесь ничего, что можно сделать.

Кстати, вы не можете пойти MongoDB? Он ничего не восстанавливает, когда вы добавляете столбец.

Ответ 4

Может быть, вы можете удалить индекс перед изменением таблицы, потому что большую часть времени на сборку занимает индекс?