Quais são as principais diferenças entre o InnoDB e o MyISAM?


245

Quais são as principais diferenças entre o InnoDB e o MyISAM?


23
Se você deseja um mecanismo de banco de dados, use o InnoDB. Você não pode comparar os dois .
Jeremy Stein

Enquanto muitas das respostas abaixo estão corretas, elas não resumem as coisas claramente, IMHO. Este site possui, e o ponto principal: o InnoDB é o bloqueio no nível da linha, o MyISAM é o bloqueio no nível da tabela. Isso significa que, de maneira geral, o MyISAM será melhor para OLAP (análise, principalmente leituras) e o InnoDB será melhor para OLTP (transações, principalmente gravações ou pelo menos muitas gravações).
Mike Williamson

Respostas:


159

A primeira grande diferença que vejo é que o InnoDB implementa o bloqueio no nível da linha, enquanto o MyISAM pode fazer apenas um bloqueio no nível da tabela. Você encontrará uma melhor recuperação de falhas no InnoDB. No entanto, ele não possui FULLTEXTíndices de pesquisa até a v5.6, assim como o MyISAM. O InnoDB também implementa transações, chaves estrangeiras e restrições de relacionamento, enquanto o MyISAM não.

A lista pode ir um pouco mais longe. No entanto, ambos têm suas vantagens únicas a favor e desvantagens um do outro. Cada um deles é mais adequado em alguns cenários que no outro.

Então, para resumir ( TL; DR ):

  • O InnoDB possui travamento no nível de linha, o MyISAM só pode travar no nível de tabela completo.
  • O InnoDB possui uma melhor recuperação de falhas.
  • O MyISAM possui FULLTEXTíndices de pesquisa, o InnoDB não tinha até o MySQL 5.6 (fevereiro de 2013).
  • O InnoDB implementa transações, chaves estrangeiras e restrições de relacionamento, o MyISAM não.

Caro senhor, então, em última análise, o que devemos usar? MyISAM ou InnoDB? estou totalmente confuso ... meu site está usando mysql e preciso decidir isso.
Sqlchild 30/08/12

3
depende do aplicativo, escreva uma lista com os recursos necessários (por exemplo, pesquisa de texto completo, chaves estrangeiras ...) e tente escolher um (tente classificar cada recurso e depois conte a pontuação). você não poderá ter todos, mas cabe a você decidir que o recurso é mais necessário.
Poelinca

2
Eu editei seu post para esclarecimentos.
Mathias Lykkegaard Lorenzen

1
@MathiasLykkegaardLorenzen graças, essa é uma das razões pelas quais nós gostamos Stackexchange
poelinca

a partir do version 5.6.4InnoDB suporta FULLTEXTpesquisa. dev.mysql.com/doc/refman/5.6/en/fulltext-restrictions.html
daydreamer:

85

Outra grande diferença ainda não mencionada é como é feito o cache para cada mecanismo de armazenamento.

MYISAM

O principal mecanismo usado é o cache de chaves. Ele apenas armazena em cache as páginas de índice dos arquivos .MYI. Para dimensionar o cache de chaves, execute a seguinte consulta:

SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.4999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1))
recommended_key_buffer_size FROM
(SELECT LEAST(POWER(2,32),KBS1) KBS
FROM (SELECT SUM(index_length) KBS1
FROM information_schema.tables
WHERE engine='MyISAM' AND
table_schema NOT IN ('information_schema','mysql')) AA ) A,
(SELECT 2 PowerOf1024) B;

Isso fornecerá a Configuração recomendada para o cache de chaves do MyISAM ( key_buffer_size ), considerando o seu conjunto de dados atual ( a consulta limitará a recomendação em 4G (4096M) .Para o SO de 32 bits, 4 GB é o limite.Para 64 bits, 8 GB.

InnoDB

O principal mecanismo usado é o InnoDB Buffer Pool. Ele armazena em cache dados e páginas de índice das tabelas do InnoDB acessadas. Para dimensionar seu InnoDB Buffer Pool, execute a seguinte consulta:

SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.49999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1)) recommended_innodb_buffer_pool_size
FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables
WHERE engine='InnoDB') A,
(SELECT 2 PowerOf1024) B;

Isso fornecerá a configuração recomendada para o tamanho do pool de buffers do InnoDB ( innodb_buffer_pool_size ), considerando seu conjunto de dados atual.

Não esqueça de redimensionar os arquivos de log do InnoDB (ib_logfile0 e ib_logfile1). O código-fonte do MySQL coloca um limite dos tamanhos combinados de todos os arquivos de log do InnoDB que devem ser <4G (4096M). Por uma questão de simplicidade, considerando apenas dois arquivos de log, veja como você pode dimensioná-los:

  • Etapa 1) Adicione innodb_log_file_size = NNN ao /etc/my.cnf (o NNN deve ser 25% do innodb_buffer_pool_size ou 2047M, o que for menor)
  • Passo 2) service mysql stop
  • Etapa 3) rm /var/log/mysql/ib_logfile[01]
  • Etapa 4) service mysql start(ib_logfile0 e ib_logfile1 são recriados)

EMBARGO

No final de ambas as consultas, há uma Consulta embutida (SELECT 2 PowerOf1024)B

  • (SELECT 0 PowerOf1024) dá a configuração em bytes
  • (SELECT 1 PowerOf1024) dá a configuração em kilobytes
  • (SELECT 2 PowerOf1024) dá a configuração em megabytes
  • (SELECT 3 PowerOf1024) dá a configuração em gigabytes
  • Não são aceites potências inferiores a 0 ou superiores a 3

EPÍLOGO

Não há substituto para o senso comum. Se você possui memória limitada, uma mistura de mecanismos de armazenamento ou uma combinação deles, será necessário ajustar para diferentes cenários.

  • Se você possui 2 GB de RAM e 16 GB de InnoDB, aloque 512 M como innodb_buffer_pool.
  • Se você possui 2 GB de RAM e 4 GB de índices MyISAM, aloque 512 M como key_buffer_size.
  • Se você possui 2 GB de RAM e 4 GB de índices MyISAM e 16 GB InnoDB, aloque 512M como key_buffer_size e 512M como innodb_buffer_pool_size.

Os cenários possíveis são infinitos !!!

Lembre-se, para o que você alocar, deixe RAM suficiente para o DB Connections e o sistema operacional.


Essas são fórmulas ruins!
Rick James

(opa - continue esquecendo, não pode ter parágrafos) ... vou adicionar uma "resposta".
Rick James

As fórmulas de Rolando para tamanhos de cache não são práticas. - Poderes de 2 não são necessários. - 4 GB em um sistema operacional de 32 bits é impossível - Etc. Aqui está meu resumo sobre como defini-los: mysql.rjweb.org/doc.php/memory (Ele aborda várias outras configurações que afetam o uso da memória.)
Rick James

2
@ Rick: Os poderes de 2 foram feitos para exibir as respostas em diferentes unidades. Fazendo (SELECIONAR 2 PowerOfTwo) Define a exibição da resposta em MB. Fazendo (SELECIONAR 3 PowerOfTwo) Define a exibição em GB. (SELECT 1 PowerOfTwo) É exibido em KB. (SELECIONAR 0 PowerOfTwo) É exibido em bytes. É isso que o (SELECT 2 PowerOfTwo) faz. Portanto, é necessário exibir SOMENTE, não impor nenhum valor assumido na arquitetura.
RolandoMySQLDBA

2
@ Rick: Você sabe o que? Na verdade, eu vou te dar um +1 por dois grandes motivos. 1) Seu URL confirma que minha resposta estava correta, pois 4 GB é o maior número a ser atribuído ao key_buffer_size. 2) Sua resposta, com seu URL, faz sentido para máquinas com pouca memória. Eu darei crédito onde o crédito é devido.
RolandoMySQLDBA 23/06

60

O InnoDB oferece:

  • Transações ACID
  • bloqueio no nível da linha
  • restrições de chave estrangeira
  • recuperação automática de falhas
  • compactação de tabela (leitura / gravação)
  • tipos de dados espaciais (sem índices espaciais)

No InnoDB, todos os dados seguidos, exceto TEXT e BLOB, podem ocupar 8.000 bytes no máximo. A indexação de texto completo não está disponível no InnoDB até o MySQL 5.6 (fevereiro de 2013). No InnoDB, os COUNT(*)s (quando WHERE, GROUP BYou JOINnão são usados) são executados mais lentamente que no MyISAM, porque a contagem de linhas não é armazenada internamente. O InnoDB armazena dados e índices em um arquivo. O InnoDB usa um buffer pool para armazenar em cache dados e índices.

O MyISAM oferece:

  • rápidas COUNT(*)s (quando WHERE, GROUP BYou JOINnão é usada)
  • indexação de texto completo (atualização: suportada no InnoDB a partir do MySQL 5.6)
  • menor pegada de disco
  • compressão de tabela muito alta (somente leitura)
  • tipos de dados espaciais e índices (R-tree) (atualização: suportada no InnoDB a partir do MySQL 5.7)

O MyISAM possui bloqueio no nível da tabela, mas não no nível de linha. Nenhuma transação. Não há recuperação automática de falhas, mas oferece a funcionalidade da tabela de reparo. Sem restrições de chave estrangeira. As tabelas MyISAM são geralmente de tamanho mais compacto no disco quando comparadas às tabelas do InnoDB. As tabelas MyISAM podem ser ainda mais reduzidas em tamanho compactando com myisampack, se necessário, mas tornam-se somente leitura. O MyISAM armazena índices em um arquivo e dados em outro. O MyISAM usa buffers de chave para armazenar em cache índices e deixa o gerenciamento de armazenamento em cache de dados no sistema operacional.

No geral, eu recomendaria o InnoDB para a maioria dos propósitos e o MyISAM apenas para usos especializados. O InnoDB agora é o mecanismo padrão nas novas versões do MySQL.


5
Eu li sua resposta e a comparei com as outras já aqui. O seu é o único a mencionar BLOBs. Eles geralmente são tomados como garantidos. O seu também é o único a mencionar o myisampack, um dos heróis desconhecidos das tabelas MyISAM de leitura rápida. O seu é um +1 hoje !!!
RolandoMySQLDBA 23/08

2
O exemplo seria uma tabela somente leitura compactada, na qual você tem atualizações pouco frequentes, substituindo completamente a tabela.
dabest1

30

Mais uma coisa: você pode fazer backup das tabelas do InnoDB apenas tirando uma captura instantânea do sistema de arquivos. O backup do MyISAM requer o uso do mysqldump e não é garantido que seja consistente (por exemplo, se você inserir em uma tabela pai e filha, poderá encontrar apenas a linha da tabela filha no seu backup).

Basicamente, se você tem outra cópia dos dados e os armazena apenas no MySQL, por exemplo, para permitir um meio padrão de acessá-los a partir de um site PHP, o MyISAM é bom (ou seja, é melhor que um arquivo CSV simples ou um arquivo de log para consulta e acesso simultâneo). Se o banco de dados é a "cópia principal" real dos dados, se você estiver fazendo INSERTe UPDATEusando dados reais de usuários, é tolice usar algo diferente do InnoDB, em qualquer tipo de escala que o MyISAM não seja confiável e difícil de gerenciar, você estará fazendo myisamchkmetade do tempo, negando qualquer ganho de desempenho ...

(Minha experiência pessoal: um banco de dados de 2 terabytes no MyISAM).


29

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 causar a corrupção dos 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 do 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.


1
Obrigado, resumo realmente informativo e claro.
informatik01

18

Na minha experiência, a diferença mais significativa é a maneira como cada mecanismo lida com o bloqueio. O InnoDB usa bloqueio de linhas enquanto o MyISAM usa bloqueio de tabela. Como regra geral, eu uso o InnoDB para escrever tabelas pesadas e o MyISAM para ler tabelas pesadas.

Outras diferenças importantes incluem:

  1. O InnoDB suporta transações e chaves estrangeiras. MyISAM não.
  2. O MyISAM usa indexação de texto completo.
  3. O MyISAM faz um péssimo trabalho ao impor a integridade dos dados.

Desatualizado - o InnoDB agora possui FULLTEXTe SPATIAL. InnoDB é bom para ambas as cargas de leitura e escrita-pesados.
Rick James

8

Eu costumo ver o MyISAM como a opção de tabela 'padrão' para o MySQL, então mostrarei as diferenças para a maioria dos usuários do InnoDB

  • Bloqueio de nível de linha
  • Aplicação de chave estrangeira
  • Suporte de transação
  • Desempenho atingido em sistemas de alto uso

5
exceto que a versão mais recente do MySQL não usa mais o MyISAM como mecanismo padrão. No 5.5, eles mudaram o padrão para InnoDB :). E eu discordo da generalização de que o InnoDB em geral apenas recebe um 'desempenho'. Tabelas InnoDB bem desenhado, com a indexação adequada e configurações de memória bem configurado pode fazer uma tabela InnoDB executar, bem como o mesmo esquema no MyISAM
TechieGurl

3
Em muitas situações de "alto uso", o InnoDB realmente funciona muito melhor que o MyISAM. O MyISAM é uma ferramenta específica para um problema específico, enquanto o InnoDB o ajudará melhor na maioria das situações (daí o motivo pelo qual a equipe do MySQL o tornou o mecanismo padrão). É porque o MyISAM foi o único mecanismo por um longo tempo que a comunidade MySQL ganhou o hábito de usar o MyISAM por padrão, mesmo depois que o InnoDB amadureceu.
Nick Chammas

2
A pesquisa FULLTEXT do InnoDB foi adicionada parcialmente no ciclo de desenvolvimento do MySQL 5.6. O URL citado agora também abrange o InnoDB.
Max Webster

5

MYISAM

O MYISAM fornece bloqueio no nível da tabela, pesquisa FULLTEXT. O MYISAM possui a coluna AUTO_INCREMENTED mais flexível que lida com todos os mecanismos de armazenamento. O MYISAM não suporta transações.

INNODB

INNODB é um mecanismo de armazenamento seguro para transações. O INNODB possui recursos de confirmação, reversão e recuperação de falhas. O INNODB suporta integridade referencial de chave estrangeira.


5

Inclui mudanças no MySQL 5.6

MOTOR DE ARMAZENAMENTO DE INNODB:

  • Ele fornece total conformidade com ACID (atomicidade, consistência, isolamento, durabilidade). A versão múltipla é usada para isolar transações entre si.
  • O InnoDB fornece recuperação automática após uma falha no servidor MySQL ou no host no qual o servidor é executado.
  • O InnoDB suporta chaves estrangeiras e integridade referencial, incluindo exclusões e atualizações em cascata.
  • O MySQL 5.6 se baseia na plataforma do InnoDB totalmente integrada como o mecanismo de armazenamento padrão
  • Estatísticas do otimizador persistente : fornece maior precisão das estatísticas de índice do InnoDB, e consistência nas reinicializações do MySQL.
  • Eliminando o cache da tabela do InnoDB: Para facilitar a carga de memória em sistemas com um grande número de tabelas, o InnoDB agora libera a memória associada a uma tabela aberta. Um algoritmo LRU seleciona tabelas que foram mais longas sem serem acessadas.
  • Suporta pesquisa de texto completo: um tipo especial de índice, o índice FULLTEXT, ajuda o InnoDB a lidar com consultas e operações DML envolvendo colunas baseadas em texto e as palavras que elas contêm. Esses índices são representados fisicamente como tabelas InnoDB inteiras.
  • O InnoDB parece ser muito mais rápido na pesquisa de texto completo que o MyISAM

Portanto, não faz sentido usar o MyISAMEngine se você já tiver atualizado para a versão 5.6; caso contrário, não espere pela atualização para o MySQL 5.6.

Desempenho do InnoDB VS MyISAM usando o MySQL 5.6


2

MyISAM

MyISAM é um mecanismo de armazenamento para MySQL. Antes do MySQL 5.5, era o mecanismo de armazenamento padrão para o MySQL. É baseado no mecanismo de armazenamento ISAM mais antigo. O MyISAM é otimizado para ambientes com operações pesadas de leitura e poucas gravações, ou nenhuma. O motivo pelo qual o MyISAM permite leituras rápidas é a estrutura de seus índices: cada entrada aponta para um registro no arquivo de dados e o ponteiro é deslocado desde o início do arquivo. Dessa maneira, os registros podem ser lidos rapidamente, principalmente quando o formato é CORRIGIDO. Assim, as linhas são de comprimento constante. Uma área típica na qual se pode preferir o MyISAM é o data warehouse, pois envolve consultas em tabelas muito grandes, e a atualização dessas tabelas é feita quando o banco de dados não está em uso (geralmente à noite). As inserções também são fáceis, porque novas linhas são anexadas ao final do arquivo de dados. Contudo, As operações de exclusão e atualização são mais problemáticas: as exclusões devem deixar um espaço vazio, ou os deslocamentos das linhas mudam; o mesmo vale para atualizações, à medida que o comprimento das linhas se torna menor; se a atualização aumentar a linha, ela será fragmentada. Para desfragmentar linhas e reivindicar espaço vazio, oOPTIMIZE TABLEcomando deve ser executado. Devido a esse mecanismo simples, geralmente as estatísticas do índice MyISAM são bastante precisas. Outras grandes desvantagens do MyISAM são a ausência de suporte a transações e chaves estrangeiras.

InnoDB

O InnoDB é um mecanismo de armazenamento para MySQL. O MySQL 5.5 e posterior o utilizam por padrão. Ele fornece os recursos de transação padrão compatíveis com ACID, além de suporte a chave estrangeira (integridade referencial declarativa). Ele implementa transações SQL e XA, espaços de tabela, FULLTEXTíndices e operações espaciais seguindo o padrão OpenGIS. Ele está incluído como padrão na maioria dos binários distribuídos pela MySQL AB, com exceção de algumas versões OEM. O software é licenciado duas vezes pela Oracle Corporation; Ele é distribuído sob a GNU General Public License, mas também pode ser licenciado para as partes que desejam combinar o InnoDB em software proprietário.

Forquilhas

O MariaDB possui um mecanismo de armazenamento chamado Aria, que é descrito como uma "alternativa segura contra falhas ao MyISAM". O MariaDB e o Percona Server usam um fork do InnoDB chamado XtraDB por padrão. O XtraDB é mantido pela Percona. As alterações do Oracle InnoDB são importadas regularmente para o XtraDB, e algumas correções de erros e recursos extras são adicionados.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.