У нас есть таблица с 500 миллионами строк. К сожалению, одним из столбцов был int (11), который представляет собой int со знаком, и это было увеличивающееся значение, которое только что перешло через 2,1 миллиарда магических чисел. Это сразу привело к простоям около 10.000 пользователей. Мы обсудили множество решений и решили, что можем просто безопасно откатить это значение, скажем, на миллиард. Но приходилось откатывать его для каждой строки.
Вот что мы сделали:
обновить Table1 Set MessageId = case when MessageId <1073741824 then 0 else MessageId - 1073741824 end;
Я протестировал это на таблице с 10 миллионами строк, и это заняло 11 минут. Поэтому я предположил, что большая таблица займет 550 минут или 9 часов. Это должно было стать нашим самым большим простоем за 3 года. (Мы стартап). Сейчас идет 18 часов.
Что нам делать?
Пожалуйста, не говорите, что мы должны были сделать. Думаю, нам следовало обновлять по несколько миллионов строк за раз.
Есть ли способ увидеть прогресс? Мог ли Mysql завис? Использование mysql 5.0.22.
Спасибо!
Попробуйте посмотреть на вывод SHOW PROCESSLIST; он должен дать вам краткое представление о том, что происходит внутри этого потока; в худшем случае вы можете убить этот поток (используя KILL $ threadID), а затем очистить его вручную.
HTH.
Возможно, вы имели в виду: update Table1 Set MessageId = case when MessageId <1073741824 then MessageId else MessageId - 1073741824 конец;
В противном случае я могу увидеть кучу сообщений с одинаковым идентификатором.
Другой способ, который может быть быстрее, на уровне sql:
create table new_table as
select (all other fields),
case msg id > xxx then msg_id - 1000000 else msg_id
from old_table;
Таким образом, вы полностью просматриваете одну таблицу и записываете другую за один раз, а не выполняете много случайных операций ввода-вывода (которые вы можете проверить с помощью iostat).