Могу ли я выполнить запрос с низким приоритетом на MySQL?

1401
Xavi Montero

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

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

Вопрос:

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

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

1
Не видя фактического запроса и не зная деталей о запросе, никто не может дать вам точный ответ. JakeGould 6 лет назад 0
Слишком широкий наверняка .... вам нужно повысить производительность запроса, затем рассмотреть вопрос о том, чтобы сделать запрос хранимой процедурой, а затем вызвать или выполнить процедуру, а не отправлять запрос из приложения и т. Д. Подумайте об использовании [объяснение] (https : //dev.mysql.com/doc/refman/5.7/en/explain.html) и [показать статус как 'last_query_cost'] (https://dev.mysql.com/doc/refman/5.7/en/server -status-variables.html # statvar_Last_query_cost) после запуска запроса, чтобы увидеть, как можно повысить производительность, как SQL работает за кулисами и т. д. Pimp Juice IT 6 лет назад 0

2 ответа на вопрос

2
music2myear

Да, ты можешь. Простой поиск 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
Michael - sqlbot

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

Проблема в том, что ресурсы, требуемые для этого 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