web-dev-qa-db-fra.com

Format de ligne MySQL: Différence entre fixe et dynamique?

MySQL spécifie le format de ligne d'une table comme fixe ou dynamique, selon les types de données de colonne. Si une table a un type de données de colonne de longueur variable, tel que TEXT ou VARCHAR, le format de ligne est dynamique; sinon, c'est fixe.

Ma question est, quelle est la différence entre les deux formats de ligne? L'un est-il plus efficace que l'autre?

45
moo

La différence n'a vraiment d'importance que pour MyISAM, les autres moteurs de stockage ne se soucient pas de la différence. EDIT: De nombreux utilisateurs ont commenté qu'InnoDB se soucie: lien 1 par steampowered , lien 2 par Kaan =.

Avec MyISAM avec des rangées à largeur fixe, il y a quelques avantages:

  1. Aucune fragmentation de ligne: il est possible avec des lignes de largeur variable d'obtenir des lignes simples divisées en plusieurs sections dans le fichier de données. Cela peut augmenter les recherches de disque et ralentir les opérations. Il est possible de le défragmenter avec OPTIMIZE TABLE, mais ce n'est pas toujours pratique.

  2. Taille du pointeur de fichier de données: Dans MyISAM, il existe un concept de pointeur de fichier de données qui est utilisé lorsqu'il doit faire référence au fichier de données. Par exemple, cela est utilisé dans les index lorsqu'ils font référence à l'emplacement réel de la ligne. Avec des tailles de largeur fixes, ce pointeur est basé sur le décalage de ligne dans le fichier (c'est-à-dire que les lignes sont 1, 2, 3 quelle que soit leur taille). Avec une largeur variable, le pointeur est basé sur le décalage d'octet (c'est-à-dire que les lignes peuvent être 1, 57, 163). Le résultat est qu'avec de grandes tables, le pointeur doit être plus grand, ce qui ajoute potentiellement beaucoup plus de surcharge à la table.

  3. Plus facile à corriger en cas de corruption. Étant donné que chaque ligne a la même taille, si votre table MyISAM est corrompue, elle est beaucoup plus facile à réparer, vous ne perdrez donc que les données réellement corrompues. Avec une largeur variable, en théorie, il est possible que les pointeurs à largeur variable soient gâchés, ce qui peut entraîner un mauvais fonctionnement des données.

Désormais, le principal inconvénient d'une largeur fixe est qu'elle gaspille plus d'espace. Par exemple, vous devez utiliser les champs CHAR au lieu des champs VARCHAR, vous vous retrouvez donc avec un espace supplémentaire occupé.

Normalement, vous n'aurez pas beaucoup de choix dans le format, car il est dicté en fonction du schéma. Cependant, cela peut valoir la peine si vous n'avez que quelques varchars ou un seul blob/texte pour essayer d'optimiser dans ce sens. Par exemple, envisagez de basculer le seul varchar en un caractère ou divisez le blob en sa propre table.

Vous pouvez lire encore plus à ce sujet sur:

http://dev.mysql.com/doc/refman/5.0/en/static-format.html

http://dev.mysql.com/doc/refman/5.0/en/dynamic-format.html

57
Harrison Fisk

Une différence clé se produit lorsque vous mettez à jour un enregistrement. Si le format de ligne est fixe, la longueur de l'enregistrement n'est pas modifiée. En revanche, si le format de ligne est dynamique et que les nouvelles données entraînent une augmentation de la longueur de l'enregistrement, un lien est utilisé pour pointer vers les données de "débordement" (c'est-à-dire qu'elles sont appelées le pointeur de débordement).

Cela fragmente la table et ralentit généralement les choses. Il existe une commande de défragmentation (OPTIMIZE TABLE), qui atténue quelque peu le problème.

10
Ben Hoffstein

Cette page dans la documentation de MySQL semble contredire la première réponse ici, dans la mesure où le format de ligne DYNAMIC signifie également quelque chose pour les tables InnoDB:

http://dev.mysql.com/doc/innodb/1.1/en/innodb-row-format-dynamic.html

7
B T

Fixe signifie que chaque ligne a exactement la même taille. Cela signifie que si la 3e ligne d'une page de données doit être chargée, elle sera exactement à PageHeader + 2 * RowSize, ce qui économise du temps d'accès.

Afin de trouver le début d'un enregistrement dynamique, la liste des décalages d'enregistrement doit être consultée, ce qui implique une indirection supplémentaire.

En bref, oui, il y a une légère baisse de performances pour les lignes dynamiques. Non, ce n'est pas très gros. Si vous pensez que ce sera un problème, testez-le.

4
Jonathan Rupp

Le fixe devrait être plus rapide et plus sûr que le dynamique, avec l'inconvénient d'avoir une longueur fixe. Vous pouvez trouver ces informations ici: http://dev.mysql.com/doc/refman/5.0/en/static-format.html

1
jmissao