Qual é a diferença entre InnoDB e MyISAM?

17

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

    
por TRiG 17.08.2009 / 11:19

5 respostas

14

ISAM = Método de acesso sequencial indexado e é essencialmente um arquivo simples (para os DBAs que podem lembrar, pense em Btrieve ou B-Tree). É uma tecnologia muito antiga - mas não deixe que isso a impeça de usá-la. Como é um arquivo simples (mais sobre isso depois), 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 ser relacional através de outra camada adicionada no topo que mantém seus links, lógica e integridade referencial.

O ISAM é brilhante se você tiver MUITOS registros (como 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 depende muito dos índices e, se você não tiver o índice correto, esteja preparado para tempos de consulta muito longos. Caso em questão: Nós tínhamos uma tabela Btrieve ISAM com 20M + registros e fazer uma recuperação e filtrar os dados com base em um índice preciso foi quase instantâneo. Usar o índice errado foi literalmente 15 minutos.

O InnoDB é ótimo se você tiver muitos links relacionais. A Tabela A faz referência a um campo na Tabela B, que faz referência à Tabela C e D. O InnoDB pode buscar esses registros usando todos os tipos de métodos de junção agradáveis (junções hash, etc), enquanto um banco de dados ISAM teria que executar várias subconsultas para cada enfileire e combine os registros manualmente.

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

    
por 17.08.2009 / 11:28
5

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

    
por 17.08.2009 / 14:05
2

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

O único outro recurso que o MyISAM tem é a pesquisa de texto completo, o que é bom para uso básico, mas a maioria das pessoas usa algum do Lucene para qualquer coisa séria.

De qualquer forma você deve ajustar o MySQL já que os padrões são essencialmente configurados para um pentium de 32MB que é compartilhado com outros serviços.

    
por 17.08.2009 / 14:20
2

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

A principal diferença entre o MyISAM e o InnoDB está na integridade referencial e nas transações. Há também outras diferenças, como bloqueio, 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, Listings) tem uma chave estrangeira (por exemplo, Product ID) apontando para uma tabela diferente (por exemplo Products), quando atualizações ou exclusões ocorrem na tabela apontada, essas alterações são em cascata para o link mesa. Em nosso exemplo, se um produto for renomeado, as chaves externas da tabela de vinculação também serão atualizadas. Se um produto for excluído da tabela "Produtos", todas as listagens que apontarem 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 existente válida.

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

Transações e amp; Atomicidade

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

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

Se uma operação for interrompida durante o uso de uma tabela MyISAM, a operação será abortada imediatamente e as linhas (ou até mesmo os dados dentro de cada linha) afetadas permanecerão afetadas, mesmo se a operação não foi concluída.

Se uma operação for interrompida durante o uso de uma tabela InnoDB, porque ela usa transações, que possuem atomicidade, qualquer transação que não foi concluída não terá efeito, já que nenhuma confirmação é feita.

Bloqueio de tabela vs Bloqueio de linha

Quando uma consulta é executada em uma tabela MyISAM, toda a tabela em que está consultando será bloqueada. Isso significa que as consultas subseqüentes serão executadas somente após o término da atual. Se você estiver lendo uma tabela grande e / ou houver operações frequentes de leitura e gravação, isso pode significar um enorme acúmulo de consultas.

Quando uma consulta é executada em uma tabela InnoDB, apenas as linhas envolvidas estão bloqueadas, o resto da tabela permanece disponível para as 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, há uma grande desvantagem que se aplica a um intervalo selecionado de tabelas, em que há uma sobrecarga na alternância entre encadeamentos do kernel e você deve definir um limite nos encadeamentos do kernel para evitar que o servidor pare. .

Transações e amp; Reversões

Quando você executa uma operação no MyISAM, as alterações são definidas; no InnoDB, essas mudanças podem ser revertidas. Os comandos mais comuns usados para controlar transações são COMMIT, ROLLBACK e SAVEPOINT. 1. COMMIT - você pode escrever múltiplas operações DML, mas as mudanças só serão salvas quando um COMMIT for feito 2. ROLLBACK - você pode descartar qualquer operação que ainda não tenha sido confirmada ainda 3. SAVEPOINT - define um ponto na lista de operações para as quais uma operação ROLLBACK pode reverter para

Confiabilidade

MyISAM não oferece integridade de dados - Falhas de hardware, desligamentos não limpos e operações canceladas podem corromper os dados. Isso exigiria reparos completos ou recriações 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 danos. Antes do InnoDB fazer quaisquer 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 poderá recuperar automaticamente a reprodução desses registros.

Indexação FULLTEXT

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

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

Conclusão

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

    
por 21.01.2015 / 16:35
1

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

    
por 17.08.2009 / 13:20