50 votes

MySQL Row Format: Différence entre fixe et dynamique?

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

Ma question est la suivante: quelle est la différence entre les deux formats de lignes? Est-ce que l'un est plus efficace que l'autre?

59voto

Harrison Fisk Points 3867

La différence vraiment uniquement les questions pour MyISAM, d'autres moteurs de stockage ne se soucient pas de la différence.

Avec MyISAM avec une largeur fixe de lignes, il y a quelques avantages:

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

  2. Fichier de données de la taille du pointeur: En MyISAM, il y a une notion de pointeur de fichier qui est utilisé lorsqu'il doit faire référence au fichier de données. Par exemple, il est utilisé dans les index quand ils se réfèrent à l'endroit où la ligne est réellement présent. Avec une largeur fixe de tailles, ce pointeur est basée sur le décalage de lignes dans le fichier (c'est à dire. les lignes sont 1, 2, 3, indépendamment de leur taille). Avec une largeur variable, le pointeur est basé sur le décalage d'octet (ie. les lignes peuvent être de 1, 57, 163). Le résultat est que, avec de grandes tables, le pointeur doit être plus grand, ce qui ajoute ensuite potentiellement beaucoup plus de surcharge de la table.

  3. Plus facile à résoudre dans le cas de la corruption. Depuis, chaque ligne est de la même taille, si votre table MyISAM est corrompu, il est beaucoup plus facile à réparer, de sorte que vous ne perdez des données qui est réellement corrompu. Avec une largeur variable, en théorie, il est possible que la largeur variable des pointeurs se foiré, ce qui peut entraîner de la tuyauterie de données dans une mauvaise voie.

Maintenant, le principal inconvénient de largeur fixe, c'est qu'il gaspille plus d'espace. Par exemple, vous devez utiliser le CHAR des champs plutôt que des champs VARCHAR, si vous vous retrouvez avec de l'espace supplémentaire pris.

Normalement, vous n'aurez pas beaucoup de choix dans le format, puisqu'il est imposé sur le schéma. Toutefois, il pourrait être utile si vous avez seulement un peu de type varchar ou un seul blob/text pour essayer de l'optimiser dans cette direction. Par exemple, envisager de passer la seule varchar dans un char, ou diviser le blob dans une table.

Vous pouvez lire plus sur ce à:

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

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

12voto

Ben Hoffstein Points 44398

Une différence clé se produit lorsque vous mettez à jour un enregistrement. Si le format de ligne est fixe, la longueur de l'enregistrement ne change pas. En revanche, si le format des lignes est dynamique et que les nouvelles données entraînent une augmentation de la longueur de l'enregistrement, un lien est utilisé pour pointer sur les données de "dépassement" (c'est-à-dire qu'il s'appelle le pointeur de dépassement).

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.

7voto

B T Points 4868

Cette page de la documentation de MySQL semble contredire la réponse principale, en ce sens que le format de ligne DYNAMIC signifie aussi quelque chose pour les tables InnoDB:

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

4voto

Jonathan Rupp Points 10900

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

Pour trouver le début d'un enregistrement dynamique, il faut consulter la liste des décalages d'enregistrement, ce qui implique un indirection supplémentaire.

En bref, oui, les performances des lignes dynamiques sont légèrement réduites. Non, ce n'est pas très gros. Si vous pensez que ce sera un problème, testez-le.

1voto

jmissao Points 328

Fixed doit être plus rapide et plus sécurisé que dynamique, avec l'inconvénient d'avoir une longueur de caractère fixe. Vous pouvez trouver cette information ici: http://dev.mysql.com/doc/refman/5.0/en/static-format.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X