O InnoDB não tem uma otimização especial para criação de
índices separados. Assim não há custo para exportar e
importar a tabela e criar índices posteriormente. O modo mais
rápido de se alterar uma tabela para InnoDB é fazer as
inserções diretamente em uma tabela InnoDB, isto é, use
ALTER TABLE ... TYPE=INNODB
, ou crie uma
tabela InnoDB vazia com definições idênticas e insira os
registro com INSERT INTO ... SELECT * FROM
...
.
Para obter um melhor controle sobre o processo de inserção, pode ser bom inserir grandes tabelas em pedaços:
INSERT INTO newtable SELECT * FROM oldtable WHERE yourkey > something AND yourkey <= somethingelse;
Depois de todos os dados serem inseridos você pode renomear as tabelas.
Durante a canversão de tabelas grandes você deve configurar á área de buffer com um tamanho grande para reduzir a E/S de disco. Não deve ser maior que 80% da memória física. Você deve configurar o arquivo de log do InnoDB grande, assim como o buffer de log.
Certifique-se de que você não irá ocupar todo o tablespace:
tabelas InnoDB gasta muito mais espaço que tabelas MyISAM. Se
um ALTER TABLE
ficar sem espaço, ele irá
iniciar um rollback, que pode levar horas se ele estiver no
limite de disco. Para inserções, o InnoDB utiliza o buffer
de inserção para fundir registros de índices secundários a
índices em grupos. Isto economiza muito a E/S de disco. No
rollback tal mecanismo não é usado e o rollback pode demorar
30 vezes mais que a inserção.
No caso de um rollback demorado, se você não tiver dados
valiosos e seu banco de dados, é melhor que você mate o
processo de banco de dados, delete todos os arquivos de dados
e de log do InnoDB e todos os arquivos de tabela
.frm
e inicie o seu trabalho de novo, do
que esperar que milhões de E/Ss de disoc de complete.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.