
По сути, моя проблема заключается в том, что у меня есть большая таблица, содержащая около 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 минут. Я ожидал некоторого снижения скорости, но не в такой степени, как я вижу.
Есть ли у вас какие-нибудь советы, как ускорить этот процесс или что может меня тормозить при таком большом наборе записей?
Что касается характеристик сервера, то они довольно хороши: куча памяти/процессора, вся база данных должна поместиться в памяти, и еще останется место для роста.