Engines MySQL – MyISAM

Olá pessoal,

Neste e nos próximos posts, iremos tratar dos engines disponíveis no MySQL! Em alguns tópicos já falamos sobre a diferença entre InnoDB e MyISAM e como consultar o Status das Engines no servidor.

Vamos explorar um pouco mais as características de cada engine, tanto como a estrutura e vantagens, começando hoje com o MyISAM.

O MyISAM foi o engine default do MySQL em versões anteriores a 5.5, ou seja, se uma tabela fosse criada sem a especificação do engine, ela era atribuída ao MyISAM.

Uma tabela MyISAM tem referência de três arquivos físicos no servidor, são eles:

.frm: armazena o formato da tabela
.MYD: armazena os dados da tabela
.MYI: armazena os índices da tabela

A referência é feita com o nome da tabela.extensão, e todos os arquivos são armazenados no datadir (diretório de dados) do servidor. Com isso, já podemos apontar a primeira vantagem ao utilizar o MyISAM:

Os índices de cada tabela são separados em arquivos diferentes dos dados, trazendo um aumento de performance no momento da consulta.

Devido a esta estrutura, as tabelas MyISAM ocupam pouco espaço no disco e também são portáteis, ou seja, você consegue copiar os arquivos de cada tabela em um servidor, e ‘exporta-los’ para outro servidor de forma direta, sem comprometer a integridade dos dados.

Porém antes de fazer isso, certifique-se que o servidor MySQL de destino tenha a mesma versão da origem, que não exista nenhum processo de escrita na tabela a ser copiada/migrada, ou de um stop no mysqld para copiar os arquivos.

É recomendado utilizar o MyISAM para tabelas que não sofram alterações com frequência, como uma tabela de cidade ou estado. Uma tabela que tenha requisição apenas de Select, até se baseando em um DW é o melhor dos mundos, pois o MyISAM oferece suporte ao FullTextSearch, um indice de texto completo que permite a realização de pesquisas avançadas além da capacidade tradicional de um SELECT + LIKE.

Porém, não é recomendado utilizar o MyISAM para uma tabela com alta concorrência de leitura e escrita, pois o nível de bloqueio é em cima da tabela e não do campo, logo se você efetuar um update em algum campo, toda a tabela ficará em lock para a próxima requisição (table lock).

Outra desvantagem considerável é que o MyISAM não oferece suporte a transação ou a chaves estrangeiras, um dos fatores principais a se levar em conta ao criar as tabelas para a sua aplicação.

Segue mais algumas especificações relevantes:

Limite de armazenamento: 256TB per table (Com base no MySQL 5.6)
Suporte a MVCC: Não
Suporte a Transações / Chave estrangeira: Não
Backup e recuperação: Sim, sendo implementado no servidor.
Suporte a cache de consulta: Sim

Apesar de ser um engine confiável, o MyISAM pode ter problemas com tabelas corrompidas. Este evento ocorre quando:

– O processo do MySQL (mysqld) é morto no meio de uma escrita.

– Ocorre alguma queda inesperada no servidor

– Falha no disco/hardware.

Nos Logs do MySQL, são geradas algumas mensagens como:

Quando o MySQL é iniciado, o mesmo já busca as tabelas corrompidas e executa um repair. Caso a tabela MyISAM seja muito grande, ultrapassando o buffer para efetuar o repair, iremos utilizar o myisamchk para efetuar reparar a tabela, porém iremos falar deste utilitário em uma outra oportunidade.

Caso queira consultar o status de uma tabela, basta executar o comando no shell do mysql:

Também é possível consultar o status de todas as tabelas de uma base, executando no mysql:

Caso alguma tabela MyISAM esteja corrompida, será informado uma mensagem semelhante a do log:

E caso seja necessário reparar a tabela de forma manual, basta executar o comando:

Na grande maioria dos casos, é possível recuperar todo o conteúdo de uma tabela MyISAM, já que as suas opções para reparação são muito eficaz com base na sua estrutura. Existem outros parâmetros que podem ser adotados no check table e no repair table, bastando clicar no link respectivo para verificar a documentação do mysql.

Será que o seu servidor utiliza tabelas MyISAM? Sim, a própria base mysql por exemplo trabalha com tabelas MyISAM, e não, você não pode alterar o engine destas tabelas, pois até o MySQL 5.6 estas tabelas foram projetadas para operar com MyISAM.

Caso queira a relação de todas as tabelas da sua instância que operam com o engine MyISAM, basta executar a consulta na information_schema:

Bem, é isso pessoal. Ao meu ver, o MyISAM é uma ótima opção de engine as suas tabelas, não é a toa que foi o default por tantas versões. Porém tudo depende da necessidade do seu projeto, referente a transações, consultas e etc.

No próximo post, iremos tratar do Engine InnoDB. Vamos falar das principais vantagens, estrutura e operação.

É isso ai pessoal.

Dúvidas, criticas ou sugestões? Fiquem a vontade, todo retorno é construtivo 🙂

Jose Wilson

One Reply to “Engines MySQL – MyISAM”

Deixe uma resposta