Mysql InnoDB и быстрое применение больших обновлений

Mysql InnoDB и быстрое применение больших обновлений

По сути, моя проблема заключается в том, что у меня есть большая таблица, содержащая около 17 000 000 товаров, к которым мне нужно очень быстро применить кучу обновлений.

Таблица содержит 30 столбцов с идентификатором int(10) AUTO_INCREMENT.

У меня есть другая таблица, в которой хранятся все обновления для этой таблицы, эти обновления должны быть рассчитаны заранее, так как на их расчет уходит несколько дней. Эта таблица имеет формат [ product_id int(10), update_value int(10) ].

Стратегия, которую я использую для быстрой выдачи этих 17 миллионов обновлений, заключается в загрузке всех этих обновлений в память в скрипте Ruby и группировке их в хэш массивов так, чтобы каждое update_value было ключом, а каждый массив — списком отсортированных product_id.

{ 
   150: => [1,2,3,4,5,6],
   160: => [7,8,9,10]
}

Обновления затем выпускаются в формате

UPDATE product SET update_value = 150 WHERE product_id IN (1,2,3,4,5,6);
UPDATE product SET update_value = 160 WHERE product_id IN (7,8,9,10);

Я почти уверен, что делаю это правильно в том смысле, что выпуск обновлений для отсортированных пакетов product_id должен быть оптимальным способом сделать это с помощью mysql / innodb.

Я столкнулся со странной проблемой, когда я тестировал обновление ~13 миллионов записей, это заняло всего около 45 минут. Теперь я тестирую с большим количеством данных, ~17 миллионов записей, и обновления занимают около 120 минут. Я ожидал некоторого снижения скорости, но не в такой степени, как я вижу.

Есть ли у вас какие-нибудь советы, как ускорить этот процесс или что может меня тормозить при таком большом наборе записей?

Что касается характеристик сервера, то они довольно хороши: куча памяти/процессора, вся база данных должна поместиться в памяти, и еще останется место для роста.

Связанный контент