Você definitivamente tem que escolher sua abordagem com base no tipo de mecanismo... otimizando para MyISAM ou para InnoDB .
Recentemente, executamos um benchmark comparando diferentes maneiras de inserir dados e medimos o tempo desde antes da inserção e até que todos os índices sejam totalmente restaurados. Estava em uma tabela vazia, mas usamos até 10 milhões de linhas.
MyISAM com
LOAD DATA INFILE
e ALTER TABLE ... ENABLE/DISABLE KEYS
ganhou sem dúvida em nosso teste (em um sistema Windows 7, MySQL 5.5.27 - agora estamos testando em um sistema Linux). ENABLE e DISABLE KEYS não funcionam para InnoDB, é apenas MyISAM. Para InnoDB, use
SET AUTOCOMMIT = 0; SET FOREIGN_KEY_CHECKS = 0; SET UNIQUE_CHECKS = 0;
se você tiver certeza de que seus dados não contêm duplicatas (não se esqueça de configurá-los para 1
após a conclusão do upload). Acho que você não precisa de
OPTIMIZE TABLE
após uma inserção em massa - as linhas do MySQL são ordenadas por inserção e o índice é reconstruído de qualquer maneira. Não há "fragmentação extra" fazendo uma inserção em massa. Sinta-se à vontade para comentar se cometi erros factuais.
ATUALIZAÇÃO: De acordo com nossos resultados de teste mais recentes e completos, o conselho para DESATIVAR / ATIVAR chaves está errado.
Um colega de trabalho fez um programa executar vários testes diferentes - uma tabela com InnoDB / MyISAM pré-preenchida e vazia, velocidades de seleção e inserções com
LOAD DATA LOCAL
, INSERT INTO
, REPLACE INTO
e UPDATE
, em tabelas "densas" e "fragmentadas" (não tenho certeza de como, acho que foi na linha de DELETE FROM ... ORDER BY RAND() LIMIT ...
com uma semente fixa para que ainda seja comparável) e índices habilitados e desabilitados. Testamos com muitas versões diferentes do MySQL (5.0.27, 5.0.96, 5.1.something, 5.5.27, 5.6.2) no Windows e no Linux (mas não as mesmas versões em ambos os sistemas operacionais). MyISAM só ganhou quando a mesa estava vazia. O InnoDB era mais rápido quando os dados já estavam presentes e geralmente funcionava melhor (exceto para espaço no disco rígido - MyISAM é menor no disco).
Ainda assim, para realmente se beneficiar dele, você tem que testá-lo você mesmo - com diferentes versões, diferentes configurações e muita paciência - especialmente em relação a inconsistências estranhas (5.0.97 foi muito mais rápido que 5.5.27 com a mesma configuração - nós ainda está procurando a causa). O que encontramos foi que
DISABLE KEYS
e ENABLE KEYS
são quase inúteis e às vezes prejudiciais se você não começar com uma mesa vazia.