Qual é a diferença entre InnoDB e MyISAM?

17

Estou usando o MySQL como meu banco de dados para o meu projeto web atual. Eu sou novo no MySQL. Por favor, explique-me a diferença entre o InnoDB e o MyISAM.

TRiG
fonte
fique à vontade para adicionar um Tagg MySQL também :)
Johan
Isso não pertence ao stackoverflow?
Ripper234 19/08/09
@ ripper234. Existem duas versões melhores desta publicação (muito mais informações; mais demonstrações de pesquisas anteriores) no SO: stackoverflow.com/q/12614541/209139 e stackoverflow.com/q/20148/209139 .
TRiG 15/04

Respostas:

14

ISAM = Método de acesso seqüencial indexado e é essencialmente um arquivo simples (para aqueles DBAs que podem se lembrar, pensar em Btrieve ou B-Tree). É uma tecnologia muito antiga - mas não deixe que isso o desencoraje em usá-la. Por ser um arquivo simples (mais sobre isso posteriormente), ele não é relacional e, portanto, não é um RDBMS e, portanto, é mais apropriado em algumas situações.

O InnoDB é o RDBMS completo como você provavelmente está familiarizado. O MyISAM pode parecer relacional através de outra camada adicionada na parte superior que mantém seus links, lógica e integridade referencial.

O ISAM é brilhante se você possui MUITOS registros (20 milhões), e os registros são na maioria autônomos (ou seja, você não precisa fazer muitos links para recuperar dados associados). Ele se baseia MUITO em índices e, se você não tiver o índice certo, esteja preparado para tempos de consulta muito longos. Caso em questão: tínhamos uma tabela IStr Btrieve com mais de 20 milhões de registros e, para recuperar e filtrar dados com base em um índice preciso, era quase instantâneo. Usar o índice errado levou literalmente 15 minutos.

O InnoDB é ótimo para se você tiver muitos links relacionais. A Tabela A faz referência a um campo na Tabela B, que faz referência às Tabelas C e D. O InnoDB pode buscar esses registros usando todos os tipos de métodos de associação (hash joins, etc), enquanto um banco de dados ISAM precisaria executar várias subconsultas para cada linha e corresponda aos registros manualmente.

Você realmente precisará fazer um curso em bancos de dados se quiser muito mais detalhes do que isso!

Mark Henderson
fonte
O ISAM é tão relacional quanto qualquer outra coisa, apenas não é otimizado para isso.
LapTop006 17/08/09
obrigado 4 sua breve descrição. Agora, basicamente eu estou desmarcado
5

O mais fundamental é que o InnoDB é transacional. MyIsam não é. O MyIsam é geralmente um pouco mais rápido; portanto, se você não precisa de transações, essa geralmente é sua melhor aposta. Para descrições detalhadas, você deve ler a documentação do MySQL.

John Gardeniers
fonte
2

Atualmente, a menos que você esteja usando uma tabela para dados de estilo de log (muito mais INSERT e SELECT, sem transações), o InnoDB geralmente é mais rápido, mais confiável, possui mais recursos, etc.

O único outro recurso que o MyISAM possui é a pesquisa de texto completo, ideal para uso básico, mas a maioria das pessoas usa parte do Lucene para algo sério.

De qualquer forma, você deve ajustar o MySQL, pois os padrões são essencialmente definidos para um pentium de 32 MB compartilhado com outros serviços.

LapTop006
fonte
2

Um pouco tarde para o jogo ... mas aqui está um post bastante abrangente que escrevi há alguns meses , detalhando as principais diferenças entre o MYISAM e o InnoDB. Pegue uma xícara (e talvez um biscoito) e aproveite.


A principal diferença entre o MyISAM e o InnoDB está na integridade e transações referenciais. Também há outras diferenças, como bloqueios, reversões e pesquisas de texto completo.

Integridade referencial

A integridade referencial garante que os relacionamentos entre as tabelas permaneçam consistentes. Mais especificamente, isso significa que quando uma tabela (por exemplo, Listagens) possui uma chave estrangeira (por exemplo, ID do Produto) apontando para uma tabela diferente (por exemplo, Produtos), quando ocorrem atualizações ou exclusões na tabela apontada, essas alterações são conectadas em cascata ao link mesa. No nosso exemplo, se um produto for renomeado, as chaves estrangeiras da tabela de vinculação também serão atualizadas; se um produto for excluído da tabela 'Produtos', todas as listagens que apontam para a entrada excluída também serão excluídas. Além disso, qualquer nova listagem deve ter essa chave estrangeira apontando para uma entrada válida e existente.

O InnoDB é um DBMS relacional (RDBMS) e, portanto, possui integridade referencial, enquanto o MyISAM não.

Transações e Atomicidade

Os dados em uma tabela são gerenciados usando instruções DML (Data Manipulation Language), como SELECT, INSERT, UPDATE e DELETE. Uma transação agrupa duas ou mais instruções DML juntas em uma única unidade de trabalho, para que a unidade inteira seja aplicada ou nenhuma.

O MyISAM não suporta transações, enquanto o InnoDB suporta.

Se uma operação for interrompida durante o uso de uma tabela MyISAM, a operação será interrompida imediatamente e as linhas (ou mesmo dados em cada linha) afetadas permanecerão afetadas, mesmo que a operação não tenha sido concluída.

Se uma operação for interrompida ao usar uma tabela InnoDB, porque ela usa transações com atomicidade, qualquer transação que não foi concluída não terá efeito, pois nenhuma confirmação é feita.

Bloqueio de tabela vs Bloqueio de linha

Quando uma consulta é executada em uma tabela MyISAM, a tabela inteira na qual está consultando será bloqueada. Isso significa que as consultas subseqüentes serão executadas somente depois que a atual for concluída. Se você estiver lendo uma tabela grande e / ou houver operações frequentes de leitura e gravação, isso pode significar um enorme atraso de consultas.

Quando uma consulta é executada em uma tabela do InnoDB, apenas as linhas envolvidas são bloqueadas, o restante da tabela permanece disponível para operações CRUD. Isso significa que as consultas podem ser executadas simultaneamente na mesma tabela, desde que não usem a mesma linha.

Esse recurso no InnoDB é conhecido como simultaneidade. Por maior que seja a simultaneidade, existe uma grande desvantagem que se aplica a um intervalo selecionado de tabelas, pois há uma sobrecarga na alternância entre os threads do kernel, e você deve definir um limite nos threads do kernel para impedir que o servidor pare. .

Transações e reversões

Quando você executa uma operação no MyISAM, as alterações são definidas; no InnoDB, essas alterações podem ser revertidas. Os comandos mais comuns usados ​​para controlar transações são COMMIT, ROLLBACK e SAVEPOINT. 1. COMMIT - você pode gravar várias operações DML, mas as alterações serão salvas somente quando um COMMIT for realizado. 2. ROLLBACK - você pode descartar quaisquer operações que ainda não foram confirmadas ainda 3. SAVEPOINT - define um ponto na lista de operações para as quais uma operação ROLLBACK pode reverter para

Confiabilidade

O MyISAM não oferece integridade de dados - falhas de hardware, desligamentos impuros e operações canceladas podem danificar os dados. Isso exigiria reparo ou reconstrução completa dos índices e tabelas.

O InnoDB, por outro lado, usa um log transacional, um buffer de gravação dupla e soma de verificação e validação automáticas para evitar corrupção. Antes de o InnoDB fazer alterações, ele registra os dados antes das transações em um arquivo de espaço de tabela do sistema chamado ibdata1. Se houver uma falha, o InnoDB recuperará automaticamente a reprodução desses logs.

Indexação FULLTEXT

O InnoDB não suporta indexação FULLTEXT até o MySQL versão 5.6.4. No momento da redação deste post, a versão MySQL de muitos provedores de hospedagem compartilhada ainda está abaixo da 5.6.4, o que significa que a indexação FULLTEXT não é suportada pelas tabelas do InnoDB.

No entanto, este não é um motivo válido para usar o MyISAM. É melhor mudar para um provedor de hospedagem que suporte versões atualizadas do MySQL. Não que uma tabela MyISAM que use a indexação FULLTEXT não possa ser convertida em uma tabela InnoDB.

Conclusão

Concluindo, o InnoDB deve ser o seu mecanismo de armazenamento padrão preferido. Escolha MyISAM ou outros tipos de dados quando eles atendem a uma necessidade específica.

d4nyll
fonte
1

Geralmente, a regra geral é que, se você deseja velocidade, use o MyISAM e se deseja estabilidade, use o InnoDB. Algo a ver com atomicidade, se bem me lembro.

sybreon
fonte
3
Exceto que não é mais verdade, o InnoDB é realmente mais rápido na maioria dos casos.
LapTop006 17/08/09
1
alguém pode adicionar um link alguns benchmarks ou algo assim ...?
187 Johan Johan