Características de Tabelas Dinâmicas
Este formato é usado se a tabela contém colunas VARCHAR
, BLOB
ou TEXT
ou se as tabelas são criadas com ROW_FORMAT=dynamic
.
Este formato é um pouco mais complexo porque cada linha tem que ter um cabeçalho que diz o seu tamanho. Um registro também pode acabar em mais de um local quando fica maior em uma atualização.
Você pode utilizar OPTIMIZE tabela
ou myisamchk
para desfragmentar uma tabela. Se você tiver dados estáticos que você acessa/altera demias na mesma tabela, como alguma coluna VARCHAR
ou BLOB
, pode ser uma boa idéia mover as colunas dinâmicas para outra tabela apenas para evitar fragmentação.
- Todas as colunas string são dinâmicas (exceto aquelas com tamanho menor que 4).
- Cada registro é precedido por um mapa de bits indicando quais colunas estão vazias (
''
) para colunas string ou zero para colunas numéricas (Isto é diferente de colunas contendo valoresNULL
). Se uma coluna de string tem um tamanho de zero depois da remoção de espaços extras, ou uma coluna numérica tem um valor de zero, isto é marcado no mapa de bits e não é salvado em disco. Strings não vazias são salvas como um byte de tamanho mais o conteudo da string. - Geralmente utiliza muito menos espaço de disco que tabelas de tamanho fixo.
- Cada registro utiliza apenas o espeço necessário. Se um registro aumenta, ele é separado em varios pedaços, de acordo com a necessidade. Isto resulta em fragmentação do registro.
- Se você atualiza uma linha com informações que ultrapassam o seu tamanho, a linha será fragmentada. Neste caso, você pode precisar executar
myisamchk -r
de tempos em tempos para obter melhor performance. Usemyisamchk -ei nome_tabela
para algumas estatísticas. - Não é fácil de recontruí-la após uma falha, pois um registro pode ser fragmentado em muitos pedaços e um link (fragmento) pode ser perdido.
- O tamanho esperado para registros de tamanho dinâmico é:
3 + (número de colunas + 7) / 8 + (número de colunas char) + tamanho empacotado de colunas numéricas + tamanho das strings + (número de colunas NULL + 7) / 8
Existe uma penalidade de 6 bytes para cada link. Um registro dinâmico é ligado sempre que uma atualização causa um aumento do registro. Cada novo link terá pelo menos 20 bytes, assim o próximo aumento estará, provavelemente, no mesmo link. Se não, haverá outro link. Você pode checar quantos links existem com
myisamchk -ed
. Todos os links podem ser removidos commyisamchk -r
.