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 valores
NULL
). 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. Use myisamchk -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 com myisamchk -r
.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.