Процессор редко является реальным узким местом. Обычно это диск с ограниченным объемом памяти, доступным для пула буферов.
Проблема в том, что ресурсы, требуемые для этого 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