Mysql InnoDB e aplicação rápida de grandes atualizações

Mysql InnoDB e aplicação rápida de grandes atualizações

Basicamente, meu problema é que tenho uma tabela grande com cerca de 17 milhões de produtos aos quais preciso aplicar várias atualizações muito rapidamente.

A tabela possui 30 colunas com o id definido como int(10) AUTO_INCREMENT.

Eu tenho outra tabela na qual todas as atualizações desta tabela estão armazenadas. Essas atualizações devem ser pré-calculadas, pois levam alguns dias para serem calculadas. Esta tabela está no formato de [product_id int(10), update_value int(10)].

A estratégia que estou adotando para emitir essas 17 milhões de atualizações rapidamente é carregar todas essas atualizações na memória em um script Ruby e agrupá-las em um hash de arrays para que cada update_value seja uma chave e cada array seja uma lista de product_id's classificados .

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

As atualizações são então emitidas no formato de

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);

Tenho certeza de que estou fazendo isso corretamente, no sentido de que emitir atualizações em lotes classificados de product_id deve ser a maneira ideal de fazer isso com mysql/innodb.

Estou enfrentando um problema estranho: quando estava testando a atualização de aproximadamente 13 milhões de registros, isso levou apenas cerca de 45 minutos. Agora estou testando com mais dados, cerca de 17 milhões de registros e as atualizações estão demorando cerca de 120 minutos. Eu teria esperado algum tipo de diminuição de velocidade aqui, mas não na medida que estou vendo.

Algum conselho sobre como posso acelerar isso ou o que poderia estar me atrasando com esse recorde maior?

No que diz respeito às especificações do servidor, elas são muito boas, muita memória/CPU, todo o banco de dados deve caber na memória com bastante espaço para crescer.

informação relacionada