Convertendo tabela grande de MyISAM para Innodb

9

Eu tenho uma tabela com cerca de 300 milhões de linhas no formato MyISAM que eu quero converter para Innodb

Meu objetivo original era reduzir o uso alterando o esquema da tabela para ter índices mais simples. Joguei fora toda a tabela, a soltei, a recriei com menos índices e agora estou reimportando. No entanto, esqueci de especificar que deveria ser innodb em vez de myisam.

Posso apenas executar o padrão ALTER TABLE ... ENGINE = INNODB? Existe algo especial que eu deva conhecer com uma mesa tão grande?

A operação de importação de dados leva cerca de 12 horas - eu detesto fazer isso novamente. Daí porque eu quero apenas convertê-lo.

Will Glass
fonte
Com 300 milhões de linhas, o MyISAM provavelmente é o mais rápido e melhor para uma tabela desse tamanho!
9119 Mark Henderson

Respostas:

14

O seguinte esforço foi publicado no livro " High Performance MySQL, Second Edition ".

Este é um excelente livro e eu o recomendaria a qualquer pessoa.

A resposta curta é:

Com o tamanho e as condições da sua mesa, não importa qual método você escolher, acho que você pode ter uma longa espera.


Conversões de tabela

Existem várias maneiras de converter uma tabela de um mecanismo de armazenamento para outro, cada uma com vantagens e desvantagens.

ALTERAR A TABELA

mysql> ALTER TABLE mytable ENGINE = Falcon;

Essa sintaxe funciona para todos os mecanismos de armazenamento, mas há um problema: pode levar muito tempo. O MySQL executará uma cópia linha por linha da sua tabela antiga em uma nova tabela. Durante esse período, você provavelmente estará usando toda a capacidade de E / S de disco do servidor e a tabela original será bloqueada para leitura enquanto a conversão for executada.

Despejo e importação

Para obter mais controle sobre o processo de conversão, você pode optar por despejar a tabela em um arquivo de texto usando o utilitário mysqldump. Depois de despejar a tabela, você pode simplesmente editar o arquivo de despejo para ajustar a instrução CREATE TABLE que ele contém. Certifique-se de alterar o nome da tabela e seu tipo, porque você não pode ter duas tabelas com o mesmo nome no mesmo banco de dados, mesmo que sejam de tipos diferentes - e o mysqldump assume como padrão escrever um comando DROP TABLE antes do comando CREATE TABLE , para que você possa perder seus dados se não tomar cuidado!

CRIAR e SELECIONAR

A terceira técnica de conversão é um compromisso entre a velocidade do primeiro mecanismo e a segurança do segundo. Em vez de descartar a tabela inteira ou converter tudo de uma vez, crie a nova tabela e use a sintaxe INSERT ... SELECT do MySQL para preenchê-la, da seguinte maneira:

mysql> CREATE TABLE innodb_table LIKE myisam_table;
mysql> ALTER TABLE innodb_table ENGINE=InnoDB;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table;

Isso funciona bem se você não tiver muitos dados, mas se tiver, geralmente é mais eficiente preencher a tabela de forma incremental, confirmando a transação entre cada bloco, para que os logs de desfazer não cresçam muito. Supondo que o id seja a chave primária, execute essa consulta repetidamente (usando valores maiores de xey cada vez) até copiar todos os dados para a nova tabela:

mysql> START TRANSACTION;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table
-> WHERE id BETWEEN x AND y;
mysql> COMMIT;

Depois de fazer isso, você ficará com a tabela original, que pode ser descartada quando terminar, e a nova tabela, agora totalmente preenchida. Tenha cuidado para bloquear a tabela original, se necessário, para evitar uma cópia inconsistente dos dados!

KPWINC
fonte
2

A instrução ALTER TABLE essencialmente faz a mesma coisa: o servidor cria uma tabela temporária na qual copia todas as linhas e, em seguida, executa um RENAME. Os formatos em disco são extremamente diferentes entre o InnoDB e o MyISAM, portanto, não espero que você encontre nenhum atalho para isso.

Outra observação (da qual você deve estar ciente, mas ajudaria outras pessoas a ler isso): o formato em disco do InnoDB depende muito da chave primária, porque agrupa os registros com base nela. Portanto, ao trabalhar com tabelas grandes do InnoDB, pense duas vezes antes de escolher a chave primária, pois a alteração recria toda a tabela, como o problema em questão.

De qualquer forma, eu recomendo fazer alguns testes primeiro em uma mesa de tamanho médio e cronometrá-los.

rpetre
fonte
2
Qualquer operação de alteração de tabela no MySQL (e que inclui a adição de índices) reconstrói a tabela.
David Pashley