Quais são as principais diferenças entre o InnoDB e o MyISAM?
Quais são as principais diferenças entre o InnoDB e o MyISAM?
Respostas:
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 ):
FULLTEXT
índices de pesquisa, o InnoDB não tinha até o MySQL 5.6 (fevereiro de 2013).version 5.6.4
InnoDB suporta FULLTEXT
pesquisa. dev.mysql.com/doc/refman/5.6/en/fulltext-restrictions.html
Outra grande diferença ainda não mencionada é como é feito o cache para cada mecanismo de armazenamento.
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.
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:
service mysql stop
rm /var/log/mysql/ib_logfile[01]
service mysql start
(ib_logfile0 e ib_logfile1 são recriados)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 gigabytesNã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.
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.
O InnoDB oferece:
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 BY
ou JOIN
nã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:
COUNT(*)
s (quando WHERE
, GROUP BY
ou JOIN
não é usada)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.
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 INSERT
e UPDATE
usando 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 myisamchk
metade do tempo, negando qualquer ganho de desempenho ...
(Minha experiência pessoal: um banco de dados de 2 terabytes no MyISAM).
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.
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.
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.
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. .
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
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.
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.
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.
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:
FULLTEXT
e SPATIAL
. InnoDB é bom para ambas as cargas de leitura e escrita-pesados.
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
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.
Inclui mudanças no MySQL 5.6
MOTOR DE ARMAZENAMENTO DE INNODB:
Portanto, não faz sentido usar o MyISAM
Engine 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.
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 TABLE
comando 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.
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.
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.