Home - www.devmedia.com.br


Como Trabalhar com Tabelas MyISAM Grandes

As tabelas MyISAM são o tipo padrão de tabelas no MySQL. Elas se destacam pelo seu alto desempenho, já que não suportam determinados recursos, tais como o controle de transações. Neste artigo descrevo algumas técnicas para que possamos trabalhar com tabelas MyISAM que possuam um número elevado de registros.

As tabelas MyISAM são representadas por 3 arquivos: o primeiro arquivo contém a descrição da tabela (.frm), ou seja, armazena o dicionário de dados da tabela. Os outros arquivos são o MYD para armazenar os dados e o MYI que contém os índices da tabela, sendo que todos os índices da tabela são armazenados em um único arquivo. Dado o esquema de armazenamento das tabelas MyISAM percebe-se que o tamanho dos arquivos estão intimamente relacionados à quantidade de registros existentes na tabela. Neste caso, em alguns Sistemas Operacionais (SO) existem restrições quanto ao tamanho máximo de um arquivo, isto é não suportam arquivos grandes. No Linux, por exemplo, existe a limitação de 2/4 GB dependendo do tipo de kernel e arquitetura de processador utilizado. Daí, introduzimos uma limitação em relação ao número máximo de registros em uma tabela MyISAM. Vale ressaltar que esta limitação está relacionada ao SO e não ao MySQL, no Windows por exemplo, o problema não se verifica.

O MySQL possui duas estratégias imediatas para contornar este problema. A primeira possibilidade é a utilização de tabelas Merge, que foram discutidas em um outro artigo, disponível no endereço abaixo:

www.sqlmagazine.com.br/Colunistas/eber/05_TabelasMySQL.asp

e a utilização de tabela MyISAM com a opção de RAID, o que é definido no momento da criação da tabela MyISAM (CREATE TABLE).

As tabelas Merge são uma coleção de tabelas MyISAM idênticas. Na verdade se trata de uma tabela "virtual", onde não são armazenados dados. Este tipo de tabela simplesmente aponta para as tabelas que a compõem. Desta forma, caso tenhamos a necessidade de armazenar uma tabela muito grande, poderíamos optar por um particionamento horizontal desta tabela baseado em algum critério arbitrário, por exemplo a data de inserção. Assim, criamos várias tabelas para armazenar os dados de acordo com os intervalos definidos por este critério, resultando em diversas tabelas menores. Para acessar os dados contidos em todas as tabelas constituídas criamos uma tabela Merge que representa o agrupamento dos dados. Nesta abordagem, cada tabela particionada poderia chegar ao tamanho máximo permitido, e o Merge poderia ultrapassar este tamanho em até N vezes, onde N é o número de tabelas geradas no particionamento.

A segunda forma de contornar a questão do tamanho do arquivo é através da criação de tabelas MyISAM com a opção de RAID, neste caso utilizando o parâmetro de criação RAID_TYPE. Para utilizar este recurso, o MySQL tem que estar habilitado com a opção --with-raid. Neste caso, o comando SHOW VARIABLES LIKE 'raid_type' retornará YES, caso contrário não será possível utilizar o recurso. A única opção suportada até a última versão (5.0.1) é o STRIPED, RAID_TYPE =1. Neste cenário, o MySQL criará vários diretórios e criará arquivos MYD dentro de cada um destes diretórios dividindo os dados em vários arquivos.

Para isto, durante a criação da tabela você deverá especificar o RAID_CHUNKS, que indica o número de diretórios a serem criados, isto é, em quantas partes a tabela será dividida. O tamanho máximo para este parâmetro é 255. Ao escrever os dados nesta tabela, o MySQL mapeará os primeiros RAID_CHUNKSIZE*1024 bytes para o primeiro arquivo, os próximos RAID_CHUNKSIZE*1024 bytes para o próximo arquivo, e assim sucessivamente. Por isto será necessário especificar também o RAID_CHUNKSIZE durante a criação da tabela. O exemplo a seguir ilustra uma tabela MyISAM com a opção de RAID.

mysql>CREATE TABLE myisam_raid (
            ->        id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
            ->        nome CHAR(50) NOT NULL
            ->)   RAID_TYPE=1 RAID_CHUNKS=10 RAID_CHUNKSIZE=100;

No exemplo serão criados 10 diretórios com 10 arquivos de dados (MYD), e os dados serão escritos em todos os arquivos de acordo com o RAID_CHUNKSIZE especificado. Além da possibilidade de superar os possíveis limites para tamanho de arquivo, este recurso também poder ser utilizado para reduzir gargalos relacionados a I/O, já que os diretórios criados pela opção RAID podem ser colocados em discos separados, aumentando o desempenho do banco para a leitura e escrita dos dados.

Abraços e até breve!

Eber M. Duarte

 


Eber Duarte é bacharel em Ciência da Computação, pós-graduado em Engenharia Elétrica e MySQL Professional Certified. Trabalha há 3 anos na EAC Software (BH/MG) como Analista e desenvolvedor de sistemas, atuando especialmente no desenvolvimento de sistemas Web. Atualmente, também é consultor e instrutor do banco de dados MySQL.
Contatos: eber@eacnet.com.br
www.mysqlbrasil.com.br ou www.eacsoftware.com.br

  Otimização do MySQL    
  Novidades da versão 5.0 do MySQL    
  Topologias de replicação no MySQL    
  Replicação de dados no MySQL    
  Como Trabalhar com Tabelas MyISAM Grandes    
  Verificação e correção de tabelas corrompidas no MySQL    
  Backup Online no MySQL    
  Backup e restauração no MySQL    
  Integridade Referencial no MySQL    
  Tabelas do MySQL    
  Gerenciamento de usuários e Controle de Acessos    
  Ferramentas Gráficas Para Modelage    
  Iniciando o Uso do MySQL    
  Boas-Vindas    
     

 

Todos os direitos reservados: DevMedia Group SQL Magazine - 2004