Antes de decidir sobre o MyISAM ou o InnoDB, você terá que examinar os dois mecanismos de armazenamento em termos de como cada um armazena em cache
MyISAM
Quando lidos, os índices de uma tabela MyISAM podem ser lidos uma vez no arquivo .MYI e carregados no cache de chaves MyISAM (conforme o tamanho de key_buffer_size ). Como você pode ler o arquivo .MYD de uma tabela MyISAM mais rápido? Com isso:
ALTER TABLE mytable ROW_FORMAT=Fixed;
Eu escrevi sobre isso em meus posts anteriores
InnoDB
OK, e o InnoDB? O InnoDB faz E / S de disco para consultas? Surpreendentemente, sim! Você provavelmente está pensando que eu sou louco por dizer isso, mas é absolutamente verdade, mesmo para consultas SELECT . Neste ponto, você provavelmente está se perguntando "Como o InnoDB está fazendo a E / S de disco para consultas?"
Tudo remonta ao InnoDB como um mecanismo de armazenamento transacional compatível com ACID . Para que o InnoDB seja Transacional, ele precisa suportar o I
in ACID
, que é Isolation. A técnica para manter o isolamento para transações é feita via MVCC, Multiversion Concurrency Control . Em termos simples, o InnoDB registra a aparência dos dados antes que as transações tentem alterá-los. Onde isso é gravado? No arquivo de espaço de tabela do sistema, mais conhecido como ibdata1. Isso requer E / S de disco .
COMPARAÇÃO
Como o InnoDB e o MyISAM realizam E / S de disco, que fatores aleatórios determinam quem é mais rápido?
- Tamanho das colunas
- Formato da coluna
- Conjuntos de caracteres
- Faixa de valores numéricos (exigindo INTs grandes o suficiente)
- Linhas sendo divididas entre blocos (encadeamento de linhas)
- Fragmentação de dados causada por
DELETEs
eUPDATEs
- Tamanho da chave primária (o InnoDB possui um índice clusterizado, exigindo duas pesquisas de chave)
- Tamanho das entradas do índice
- A lista continua...
EPÍLOGO
Assim, em um ambiente de leitura pesada, é possível que uma tabela MyISAM com um formato de linha fixa supere as leituras do InnoDB do InnoDB Buffer Pool se houver dados suficientes sendo gravados nos logs de desfazer contidos no ibdata1 para suportar o comportamento transacional imposta aos dados do InnoDB. Planeje seus tipos de dados, consultas e mecanismo de armazenamento com muito cuidado. Depois que os dados crescem, pode ser muito difícil mover os dados.
A propósito, escrevi algo parecido com isso há 5 dias: Como atribuir um limite de memória para o mySQL?