Mysql InnoDB e rapidamente aplicando grandes atualizações

1
Basicamente, meu problema é que tenho uma grande tabela com cerca de 17.000.000 de produtos e preciso aplicar várias atualizações rapidamente.

A tabela tem 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 precisam 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 tomando para emitir esses 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 matrizes para que cada update_value seja uma chave e cada matriz 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

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 que estou fazendo isso corretamente no sentido de que a emissão de atualizações em lotes ordenados de product_id's deve ser a melhor maneira de fazer isso com o mysql / innodb.

Estou com um problema estranho, no qual, quando eu estava testando com a atualização de ~ 13 milhões de registros, isso levou apenas 45 minutos. Agora estou testando com mais dados, ~ 17 milhões de registros e as atualizações estão chegando perto de 120 minutos. Eu teria esperado algum tipo de diminuição de velocidade aqui, mas não no grau que estou vendo.

Algum conselho sobre como eu posso acelerar isso ou o que poderia estar me atrasando com esse conjunto de registros maior?

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

    
por Marklar 30.10.2012 / 19:34

0 respostas

Tags