Похоже, единственный вариант, который у вас есть, - это выполнить ОБНОВЛЕНИЕ в виде фрагментов. Если вы, например, добавили LIMIT 1000
в свой оператор, производительность не должна заметно снизиться (я предполагаю, что этот запрос должен выполняться в действующей базе данных).
Вы говорите, что у вас нет прямого доступа; если эти люди могут запускать сценарии Bash, вы можете просто зациклить оператор с LIMIT столько раз, сколько необходимо, поместив sleep #
в цикл. Может быть, это был бы жизнеспособный обходной путь.
Как отмечали другие - да, однократное ОБНОВЛЕНИЕ уже является самым быстрым методом . Но, похоже, его проблема в том, что даже это занимает слишком много времени, поэтому я предложил сделать этот фрагмент по частям.
Выполнение по частям будет выполняться еще дольше, пока оно не будет выполнено, но оно не должно занимать базу данных и сделать ее недоступной для других пользователей (если вы выберете хороший интервал, то есть). Проблема заключается в записи в базу данных, а не в поиске (то есть с использованием WHERE LENGTH(name) < 3
). Таким образом, хотя этот метод увеличит общую нагрузку на базу данных, он будет распространяться со временем и, следовательно, не будет блокировать базу данных. Вы могли бы, например, запустите это на 100 кусках и сделайте паузу через две секунды после каждого. Пусть это пройдет всю ночь, и никто не заметит.