Quando se trata de MySQL, seria difícil entender MyISAM e InnoDB, que são dois dos motores de armazenamento MySQL mais conhecidos e amplamente utilizados. Hoje, vou falar com vocês sobre a diferença entre MyISAM e InnoDB no MySQL...
O que é MyISAM?
MyISAM é o mecanismo de armazenamento padrão para o sistema de gerenciamento de banco de dados relacional MySQL (antes da versão 5.5)。 Essa estrutura de armazenamento de tabelas MySQL estende muitos recursos úteis do antigo código ISAM. Na nova versão do MySQL, o motor InnoDB está amplamente substituindo o MyISAM devido às suas vantagens em termos de transações, integridade referencial e maior concorrência. Cada tabela MyISAM corresponde a três arquivos no disco rígido. Todos os três arquivos têm o mesmo nome de arquivo, mas extensões diferentes para indicar seu propósito de tipo: .frm contém a definição da tabela, mas esse arquivo não faz parte do motor MyISAM, mas sim do servidor; .MYD armazena os dados da tabela; .MYI é o arquivo índice da tabela.
O que é o InnoDB?
O InnoDB é outro mecanismo de armazenamento para MySQL, e a nova versão do padrão lançada pelo MySQL AB está incluída em todos os pacotes de instalação binária.a partir da 5.5 como motor de armazenamento padrão。 Suas vantagens em relação a outros motores de armazenamento são o suporte para transações compatíveis com ACID (semelhante ao PostgreSQL) e a integridade dos parâmetros (ou seja, suporte a chaves estrangeiras).
A Oracle Corporation adquiriu a Innobase em outubro de 2005. O Innobase utiliza autorização de autenticação dupla. Ele é distribuído usando GNU e também permite que outros grupos que desejam incorporar o InnoDB em softwares comerciais obtenham uma licença.
Os motores de armazenamento mais populares são MyISAM e InnoDB. As principais diferenças entre MyISAM e InnoDB são o desempenho e o controle de transações. MyISAM é uma implementação estendida do ISAM inicial (Indexed Sequential Access Method, ISAM não é mais suportado após o MySQL 5.0), ISAM foi projetado para lidar com situações em que a frequência de leitura é muito maior que a frequência de gravação, então ISAM e posteriormente MyISAM não consideram o suporte de coisas, excluem TPM, não precisam de registros de transação, a eficiência de consulta ISAM é considerável e o consumo de memória é muito pequeno. O MyISAM herda esses benefícios enquanto acompanha o tempo com uma grande quantidade de novos recursos úteis e ferramentas relacionadas. Por exemplo, considerando o controle de concorrência, locks em nível de tabela são fornecidos e, embora o MyISAM em si não suporte tolerância a falhas, ele pode ser usado para recuperar falhas por meio do myisamchk. E como o MyISAM usa seus próprios arquivos de armazenamento independentes (arquivo de dados MYD e arquivo índice MYI) para cada tabela, é muito conveniente fazer backup e restaurar (a sobrescritura de cópias é suficiente), além de suportar recuperação online. Comparado a outros motores de armazenamento, o MyISAM possui a maioria das ferramentas para checar e reparar tabelas. As tabelas MyISAM podem ser comprimidas e suportam busca em texto completo. Eles não são seguros para transações e não suportam chaves estrangeiras, então se sua aplicação não exige transações e só gerencia operações básicas de CRUD, MyISAM é o caminho a seguir. O InnoDB foi projetado para situações de leitura e escrita com alta concorrência, utilizando MVCC (Multi-Version Concurrency Control) e locks em nível de linha para fornecer suporte a transações compatíveis com ACID. O InnoDB suporta integridade de referência de chave estrangeira e possui capacidades de recuperação de falhas. Além disso, o desempenho do InnoDB é realmente bastante bom, especialmente ao processar grandes volumes de dados, em termos oficiais: a eficiência da CPU do InnoDB é incomparável à de outros mecanismos de armazenamento relacional de banco de dados baseados em disco. No entanto, o backup e recuperação do InnoDB é um pouco mais problemático, a menos que você use o suporte de espaço de tabelas multi-mesas, fornecido pela versão 4.1 ou posterior, porque, ao contrário do MyISAM, os arquivos de dados do InnoDB não correspondem a cada tabela de forma independente. Em vez disso, o espaço compartilhado é usado, e o método simples de sobrescrevimento de cópias não é adequado para ele, e os dados precisam ser restaurados após parar o MYSQL. Usar o tablespaced por tabela faz com que cada tabela corresponda a um arquivo separado, a situação é muito mais simples. Ele possui as mesmas características dos tipos BDB, e eles também suportam chaves estrangeiras. As tabelas InnoDB são rápidas e têm recursos mais ricos que o BDB, então é recomendado se você precisa de um motor de armazenamento transacionalmente seguro.
Em geral, o InnoDB é uma boa escolha se for necessário suporte a transações e possui alta frequência de leitura e gravação concorrente. O BDB pode ser considerado se a frequência de leituras e gravações simultâneas não for alta, mas o BDB não será mais suportado no MySQL 5.1 e versões posteriores. Essa opção desapareceu
Por padrão, as transações do InnoDB são abertas (defina autocommit = 0), o que significa que toda vez que um registro é inserido, a tabela do InnoDB o tratará como uma transação separada. Então, se inserirmos 10.000 registros e não fecharmos a transação, a tabela do tipo InnoDB tratará como 10.000 transações, e o tempo total de inserção nesse momento é muito alto, neste momento, devemos desligar a transação primeiro e depois inseri-la, então a velocidade será muito rápida. Quanto ao Heap e BDB (Berkeley DB), relativamente falando, a taxa de penetração não é tão boa quanto nas duas anteriores, mas em alguns casos, O mecanismo de armazenamento de heap ainda é muito aplicável, armazenando dados na memória, e é extremamente rápido porque não há E/S de disco esperando. Mas, como é um motor de armazenamento de memória, quaisquer modificações feitas desaparecem após o reinício do servidor. Heap é um ótimo lugar para usar o BDB para testes, pois é o primeiro mecanismo de armazenamento transacionalmente seguro do MySQL. Construído com base na biblioteca de banco de dados Berkeley DB, ele também é transacionalmente seguro, mas o BDB obviamente não é tão popular quanto o InnoDB, pois a maioria dos motores de armazenamento do MySQL que suportam transações também busca MVCC ou mecanismos de travamento em nível de linha, enquanto o BDB suporta apenas o Bloqueio em nível de página.
Motor InnoDB
O InnoDB é um motor de armazenamento transacional que suporta rollbacks e foi projetado para fornecer serviços de alto desempenho ao processar grandes volumes de dados, além de estabelecer pools de buffer na memória em tempo de execução para armazenar dados e índices.
Vantagens do motor InnoDB:
1. Suporte ao processamento de transações e recursos de transação ACID;
2. Quatro níveis de isolamento do padrão SQL são realizados;
3. Suportar restrições de lock em nível de linha e chave estrangeira;
4. Você pode usar logs de transação para recuperação de dados.
5. O nível de bloqueio é lock de linha, que é adequado para modificações frequentes de tabelas com alta concorrência, e alta concorrência é melhor que MyISAM. A desvantagem é que o consumo do sistema é grande.
6. O índice não apenas armazena em cache, mas também armazena dados em cache, o que requer mais memória do que o MyISAM.
Desvantagens do motor InnoDB:
Como não salva o número de linhas na tabela, toda a tabela é escaneada ao usar estatísticas COUNT.
Motor MyISAM
MyISAM é o motor padrão antes do MySQL 5.5.5 e foi projetado para ler rápido.
Vantagens do Motor MyISAM:
1. Leitura de alto desempenho;
2. Como economiza o número de linhas na tabela, a tabela inteira não será escaneada ao usar estatísticas COUNT;
Desvantagens do motor MyISAM:
1. O nível da fechadura é uma fechadura de mesa, e a vantagem da fechadura do relógio é que a trava é pequena e a fechadura é rápida; As desvantagens são que a granularidade do bloqueio é grande, a probabilidade de impulso do bloqueio é alta e a capacidade de concorrência é baixa, o que é adequado para serviços baseados em consulta.
2. Este motor não suporta transações ou chaves estrangeiras.
3. As operações INSERT e UPDATE precisam travar toda a tabela;
4. Ele armazena o número de linhas na tabela, de modo que, ao SELECT COUNT(*) FROM TABLE, ele só precisa ler diretamente os valores salvos sem escanear toda a tabela.
Cenários aplicáveis
MyISAM é adequado para: (1) realizar muitos cálculos de contagem; (2) Inserções pouco frequentes e consultas muito frequentes; (3) Não há negócios.
O InnoDB é adequado para: (1) altos requisitos ou transações de confiabilidade; (2) Atualizações e consultas de tabelas são bastante frequentes, e a chance de bloqueio de tabela é relativamente alta.
Comparação de tabelas
| Propriedades | MyISAM | Heap | BDB | InnoDB | | Transações | Não suportado | Não suportado | Dar apoio | Dar apoio | | Granularidade do lock-ul | Tranca de mesa | Tranca de mesa | Bloqueio de Página (página, 8KB) | Fechadura | | armazenamento | Arquivos divididos | Na memória | Um arquivo por tabela | Espaço de mesa | | Nível de isolamento | não | não | Leia Comprometido | Todos | | Formato portátil | ser | N/A | não | ser | | Completude das citações | não | não | não | ser | | Chave primária de dados | não | não | ser | ser | | O MySQL armazena em cache os registros de dados | não | Sim | Sim | Sim | | usabilidade | Versão completa | Versão completa | MySQL-Max | Versão completa |
Algumas diferenças nos detalhes
1. O InnoDB não suporta índices do tipo FULLTEXT, que é suportado desde o MySQL 5.6 (experimental).
2. O InnoDB não salva o número específico de linhas da tabela, ou seja, ao executar select count() da tabela, o InnoDB precisa escanear toda a tabela para calcular quantas linhas existem, mas o MyISAM só precisa simplesmente ler o número de linhas salvas. Note que quando a instrução count() contém uma condição where, a operação é a mesma para ambas as tabelas.
3. Para campos de AUTO_INCREMENT tipo, o InnoDB deve conter um índice com apenas esse campo, mas na tabela MyISAM, você pode criar um índice conjunto com outros campos.
4. Quando DELETE FROM a tabela, o InnoDB não recria a tabela, mas a exclui linha por linha.
5. A operação LOAD TABLE FROM MASTER não funciona para o InnoDB, a solução é primeiro mudar a tabela do InnoDB para a tabela MyISAM, importar os dados e depois trocá-los para a tabela InnoDB, mas ela não é aplicável à tabela que utiliza recursos adicionais do InnoDB (como chaves estrangeiras).
6. Além disso, o bloqueio de linha da tabela InnoDB não é absoluto; se o MySQL não puder determinar o intervalo a ser escaneado ao executar uma instrução SQL, a tabela InnoDB também bloqueará toda a tabela.
7. O InnoDB não suporta indexação de texto completo, enquanto o MyISAM suporta. Indexação de texto completo refere-se à criação de um índice de ordem inversa de cada palavra em char, varchar e texto (exceto para palavras de parada). O índice de texto completo do MyISAM é, na verdade, inútil, porque não suporta segmentação de palavras em chinês, e deve ser escrito na tabela de dados pelo usuário após a segmentação de palavras, e palavras com menos de 4 caracteres chineses serão ignoradas como palavras de parada.
|