Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Entendendo a estrutura de registro do MyISAM


A informação que você tem na pergunta sobre o MyISAM está no alvo. No entanto, gostaria de responder às suas duas perguntas adicionais:

ÚLTIMA PERGUNTA


De acordo com o livro



Capítulo 10:"Motores de Armazenamento" Página 196 O parágrafo 7 diz

Com base nesse parágrafo, o registro antigo é substituído por dados de ligação somente se os novos dados a serem inseridos não couberem no bloco alocado anteriormente. Isso pode resultar em muitas linhas inchadas.

PERGUNTA ADICIONAL


Da minha resposta anterior, haveria muitos blocos que
  • bloco de espaço
  • a duração do registro
  • o número de bytes não utilizados no bloco
  • Sinalizadores de indicadores de valor NULL
  • possivelmente um ponteiro para a continuação do registro se o registro não couber no espaço criado anteriormente e tiver que ser dividido

Esses links de registro começariam na frente de cada linha que tivesse dados superdimensionados sendo inseridos. Isso pode inchar as tabelas MyISAM .MYD arquivo muito rapidamente.

SUGESTÕES


O formato de linha padrão de um MyISAM é Dinâmico. Quando uma tabela é dinâmica e experimenta muitos INSERTs, UPDATEs e DELETEs, essa tabela precisaria ser otimizada com
OPTIMIZE TABLE mytable;

Existe uma alternativa:mude o formato de linha da tabela para Fixo. Dessa forma, todas as linhas são do mesmo tamanho. É assim que você torna o formato de linha Fixo:
ALTER TABLE mytable ROW_FORMAT=Fixed;

Mesmo com um Formato de Linha Fixo, deve-se levar tempo para localizar um registro disponível, mas o tempo seria O(1) tempo de pesquisa (em termos leigos, levaria a mesma quantidade de tempo para localizar um registro disponível, não importa quantas linhas a tabela tem ou quantas linhas deletadas existem). Você pode ignorar essa etapa ativando inserção_concorrente do seguinte modo:

Adicione isto ao meu.cnf
[mysqld]
concurrent_insert = 2

A reinicialização do MySQL não é necessária. Apenas corra
mysql> SET GLOBAL concurrent_insert = 2;

Isso faria com que todos os INSERTs fossem para o fundo da tabela sem procurar espaço livre.

Vantagem das tabelas de linhas fixas

  • INSERTs, UPDATEs e DELETEs seriam um pouco mais rápidos
  • SELECT são 20-25% mais rápidos

Aqui estão alguns dos meus posts sobre SELECT sendo mais rápido para formatos de linha sendo corrigidos

Desvantagem das tabelas de linhas fixas


Na maioria dos casos, quando você executa ALTER TABLE mytable ROW_FORMAT=Fixed; , a tabela pode crescer 80-100%. O .MYI arquivo (páginas de índice para a tabela MyISAM) também cresceria na mesma taxa.

EPÍLOGO


Se você quer velocidade para tabelas MyISAM e pode conviver com tabelas maiores, minhas sugestões alternativas seriam necessárias. Se você quiser economizar espaço para cada tabela MyISAM, deixe o formato da linha como está (Dinâmico). Você terá que compactar a tabela com OPTIMIZE TABLE mytable; mais frequente com tabelas dinâmicas.