1

У меня есть таблица MySQL с данными по 3 ГБ, а ALTER TABLE для создания нового поля длится около 15 минут на этапе подготовки.

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

Вопрос:

Есть ли способ запустить это каким-то образом, например "фон", и позволить всем циклам ЦП сначала посещать "другие запросы", и только если есть свободный ЦП, затем запустить ALTER?

Как правильно сделать "длинный стол" в производстве?

2 ответа2

2

Да, ты можешь. Простой поиск Google нашел этот ответ на нашем дочернем сайте SE: https://stackoverflow.com/questions/24704086/low-priority-query-in-mysql

Вы можете использовать LOW_PRIORITY или HIGH_PRIORITY в своих запросах в зависимости от типа выполняемого запроса:

INSERT [LOW_PRIORITY | HIGH_PRIORITY] INTO ...
SELECT [HIGH_PRIORITY] * FROM ...
UPDATE [LOW_PRIORITY] table ...
1

Процессор редко является реальным узким местом. Обычно это диск с ограниченным объемом памяти, доступным для пула буферов.

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

В MySQL нет никакого способа для расстановки приоритетов запросов, но если бы они существовали, это, скорее всего, только продлило бы вашу агонию, поскольку блокировка на уровне таблицы продолжалась бы дольше.

Попробуй это:

ALTER TABLE t1
  ADD COLUMN c2 BIGINT UNSIGNED NOT NULL AFTER c1,
  LOCK=NONE,
  ALGORITHM=INPLACE;

Если сервер не позволит вам сделать это - что должно решить вашу проблему - тогда сообщение об ошибке должно объяснить причину.

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

SET @@FOREIGN_KEY_CHECKS = 0; -- before ALTER
SET @@FOREIGN_KEY_CHECKS = 1; -- after ALTER

Это не отключает ограничения внешнего ключа для таблицы. Это только освобождает любые запросы, которые вы запускаете от вашего текущего соединения, от необходимости предпринимать шаги, чтобы избежать нарушения целостности отношений. Пока вы ничего не делаете для нарушения целостности отношений, это безопасная стратегия, которую можно использовать, но только тогда, когда она вам нужна.

https://dev.mysql.com/doc/refman/5.7/en/alter-table.html

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .