1

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

Любой совет, как я могу ускорить это или что может замедлить меня с этим большим набором записей?

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

0