Не отрабатывает скрипт по апдейту записей в таблице, где более 1 млн строк
Столкнулась с проблемой, что при запуске node.js скрипта на апдейт таблицы, бекенд падает с 502 ошибкой.
Задача скрипта достать все записи по условию, изменить их и записать обратно в таблицу с помощью INSERT ... ON DUPLICATE KEY UPDATE. К сожалению, я не знаю, что именно подает, Select или Insert, т.к. это происходит на продакшене, а у меня доступа к нему нет.
Вот код скрипта:
/* эта функция выполняет вот такой sql запрос:
SELECT m.id, m.recipients_addresses, m.content, tm.from_name, tm.reply_to,
tm.attachments
FROM messages m //эта таблица содержит более миллиона строк
INNER JOIN twilio_messages tm ON m.id = tm.id
WHERE tm.segments IS NULL;
*/
const messages = await this.messageRepository.findMessagesWithoutTwilioCredits();
const data = messages.reduce((arr, message) => {
const content = message.content || 'INCOMING MMS';
const isGsmCompatible = checkGsmCompatibility(content);
const recipient = JSON.parse(message.recipients_addresses)[0];
if (/^\+?\d+$/.test(recipient)) {
arr.push({
id: message.id,
fromName: message.from_name,
replyTo: message.reply_to,
attachments: message.attachments,
segments: countTextChunks(content, isGsmCompatible, !!message.attachments),
international: isInternationalNumber(recipient),
});
}
return arr;
}, []);
/*
эта функция обновляет поля segments и international у тех записей, которые мы нашли с помощью select
*/
await this.twilioMessageRepository.bulkUpdate(data);
Есть вариант не делать select сразу на все записи, а сделать limit-offset по чанкам и, соответственно, обновлять по кусочкам.
Возможно будет еще лучше сделать форк каждой итерации в отдельный процесс.
В общем, буду благодарна за советы, если вы уже сталкивались с такой ситуацией.