Acelere inserções do MySQL com partições no MyISAM com chave exclusiva

9

Eu tenho uma tabela MyISAM grande (~ 30 milhões de linhas). Em algum momento eu mudei para o formato de linha fixa, agora a tabela ocupa ~ 40Gb no disco e 2Gb para índices. A tabela possui um índice exclusivo e existem 100 consultas 'inserir na atualização de chave duplicada' por segundo. À medida que a mesa cresce, essas pastilhas estão se tornando cada vez mais lentas.

Não tenho certeza, mas as partições me ajudarão a acelerar as inserções?

d0rc
fonte

Respostas:

1

Antes de tudo, gravações simultâneas definitivamente não são uma opção para armazenamento MyISAM. Cada um deles trava uma tabela inteira (exceto em alguns casos). Se o InnoDB não combina bem com você, tente o TokuDB. Mas será mais lento em comparação com o MyISAM devido à natureza transacional do mecanismo TokuDB (e InnoDB, é claro) (você deve escrever os mesmos dados pelo menos duas vezes: diário e arquivos de dados). Além disso, se o servidor travar algum dia, você estará aguardando horas até que a tabela MyISAM de 40Gb seja reparada.

Se você ainda deseja carregar dados em suas tabelas MyISAM e deseja fazê-lo rapidamente, posso recomendar o uso em LOAD DATA INFILEvez de inserções. Essa é a maneira mais rápida de carregar grandes volumes de dados na tabela. E sim, os índices diminuirão o desempenho da inserção de maneira exponencial.

Uma palavra sobre partições: as instruções INSERT no MySQL não suportam remoção, portanto todas as suas partições serão varridas em cada instrução para uma correspondência de índice exclusiva. Além disso, todas as partições serão bloqueadas até a inserção terminar.

GreyWolf
fonte
Mais um mecanismo interessante: code.facebook.com/posts/190251048047090/…
GreyWolf
0

Essas consultas de inserção são simultâneas ou originadas no mesmo processo? Se eles são simultâneos, é melhor usar o armazenamento do InnoDB para esta tabela porque o MyISAM bloqueia a tabela inteira e o InnoDB utiliza bloqueios de linha. Se alternar para outro armazenamento não for uma opção, tente a instrução INSERT DELAYED e várias outras otimizações de inserção . O particionamento não ajudará, a menos que você coloque partições diferentes em diferentes discos físicos.

Alex
fonte
Essas inserções são simultâneas. Mas o InnoDB é muito lento em 'inserir atualização de chave duplicada', portanto não é uma opção. Pelo que sei, o IO não é um gargalo - a quantidade de RAM >> do tamanho das tabelas, incluindo índices e armazenamento de gravações, está ativada. Eu acho que o problema está em algum lugar nos bloqueios internos do mysql ou algo assim.
d0rc
INSERT DELAYED deve ser usado apenas para instruções INSERT que especificam listas de valores. O servidor ignora as instruções DELAYED para INSERT ... SELECT ou INSERT ... ON DUPLICATE KEY UPDATE.
llazzaro
"O InnoDB está muito lento" - você já tentou ajustá-lo um pouco? As configurações padrão são muito ruins.
RVS