Не отрабатывает скрипт по апдейту записей в таблице, где более 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 по чанкам и, соответственно, обновлять по кусочкам.

Возможно будет еще лучше сделать форк каждой итерации в отдельный процесс.

В общем, буду благодарна за советы, если вы уже сталкивались с такой ситуацией.


Ответы (0 шт):