Каков наилучший способ выполнить массовое обновление всех записей в большой таблице - PullRequest
0 голосов
/ 23 апреля 2019

Каков наилучший способ выполнить массовое обновление всех записей в большой таблице в MySQL?

Во время процесса очистки мы обновляем все строки в таблице пользователей, которая имеет 28M строк, дозамаскировать несколько столбцов.В настоящее время на выполнение граблей уходит около 2 часов, а срок действия сеанса AWS также составляет 2 часа.Если задача rake занимает больше времени, чем истекает сеанс, сборка завершится неудачей.

Из-за большого количества записей мы обновляем 25K строк за раз, используя find_in_batches, а затем update_all в результатах.Мы дросселируем между каждой партией, спя в течение 0,1 с, чтобы избежать высокой загрузки ЦП.

Итак, вопрос в том, можем ли мы как-нибудь оптимизировать массовое обновление или мы увеличим срок действия сеанса AWS до 3 часов?

Один из вариантов - пакетирование по диапазонам идентификаторов., а не по точным размерам партии.Таким образом, обновление между идентификатором 1-100000, затем 100001-200000 и так далее.Это позволяет избежать больших наборов идентификаторов, передаваемых по кругу.Поскольку в идентификаторах будут пропуски, каждый пакет будет иметь разный размер, но это не может быть проблемой.

Спасибо за ваш вклад.

1 Ответ

0 голосов
/ 23 апреля 2019

Для таких больших обновлений очень важны накладные расходы на выборку записей и создание экземпляров объектов AR (а также будет замедление работы с GC), самый быстрый способ выполнить - это написать необработанный SQL-запрос, который будет выполнять обновление (или использовать update_all для его построения, что очень похоже, но позволяет использовать области видимости / объединения по отношениям).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...