Ce format est utilisé avec les tables qui contiennent des
colonnes de type VARCHAR
,
BLOB
ou TEXT
, ou si la
table a été créée avec l'option
ROW_FORMAT=dynamic
.
Ce format est un peu plus complexe, car chaque ligne doit avoir un entête pour indiquer sa longueur. Une ligne peut aussi être répartie sur plusieurs blocs, lorsqu'elle est agrandie lors d'une modification.
Vous pouvez utiliser la commande SQL OPTIMIZE
table
ou Shell myisamchk
pour
défragmenter une table. Si vous avez des données statiques
que vous modifiez souvent dans la même table, avec des
colonnes VARCHAR
ou
BLOB
, il peut être une bonne idée de
placer des colonnes dans une autre table, pour éviter la
fragmentation@ :
Toutes les colonnes de type chaîne sont dynamiques (hormis celle qui sont de taille inférieure à 4).
Chaque ligne est précédée d'un octet qui indique
quelles sont les lignes vides (''
, bit
à 1) et celle qui le ne sont pas (bit à 0). Une colonne
vide n'est pas la même choses qu'une colonne qui contient
NULL
. Si une colonne a une taille de
zéro après avoir supprimé les espaces finaux, ou un
nombre a une valeur de zéro, il est marqué dans cet
octet, et la colonne sera ignorée sur le disque. Les
chaînes non vides sont sauvées avec un octet de plus
pour y stocker la taille.
Ce format prend généralement moins de place que des tables à format fixe.
Chaque ligne consomme autant d'espace que nécessaire. Si
une ligne devient trop grande, elle sera coupée en blocs
et écrites dans le fichier de données. Cela engendre la
fragmentation du fichier de données. Par exemple, si vous
modifiez une ligne avec des informations qui excèdent la
capacité courante de la ligne, la ligne sera fragmentée.
Dans ce cas, vous pouvez avoir à exécuter la commande
myisamchk -r
de temps en temps pour
améliorer les performances. Utilisez myisamchk
-ei tbl_name
pour obtenir des statistiques.
Ce format de table n'est pas toujours facile à reconstituer après un crash, car une ligne peut être fragmentée en de nombreux blocs, et un fragment peut manquer.
La taille d'une ligne de format variable se calcule avec :
3 + (nombre de colonnes + 7) / 8 + (nombre de colonnes de tailles chars) + taille compactée des colonnes numériques + taille des chaînes + (nombre de colonne de valeur NULL + 7) / 8
Il y a un aussi un supplément de 6 octets pour chaque
lien. Une ligne de format dynamique utilise un lien à
chaque fois qu'une modification cause un agrandissement de
la ligne. Chaque nouveau bloc lié fait au moins 20
octets, pour que le prochain agrandissement utilise aussi
ce bloc. Si ce n'est pas le cas, un nouveau bloc sera
lié, avec un autre coût de 6 octets. Vous pouvez
vérifier le nombre de liens dans une table avec la
commande myisamchk -ed
. Tous les liens
sont supprimés avec la commande 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.