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 la colonne. Si une table a un type de données de colonne de longueur variable, tel que le texte ou VARCHAR, le format de ligne est dynamique; autrement, il est fixe.

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

45
demandé sur moo 2008-09-29 06:25:28

5 réponses

la différence n'importe vraiment que pour MyISAM, les autres moteurs de stockage ne se soucient pas de la différence. EDIT: de nombreux utilisateurs ont fait remarquer que InnoDB s'en soucie:lien 1 par steampowered,lien 2 en Kaan.

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

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

  2. pointeur de fichier de données taille: dans MyISAM, il existe un concept de pointeur de fichier de données qui est utilisé quand il a besoin de référence le 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 des tailles de largeur fixes, ce pointeur est basé sur le décalage de ligne dans le fichier (c.-à-d. 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 (ie. 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 frais généraux à la table.

  3. plus facile à corriger en cas de corruption. Puisque chaque ligne est de la même taille, si votre table MyISAM est corrompue, il est beaucoup plus facile à réparer, de sorte que vous ne perdrez que des données qui sont en fait corrompu. Avec variable largeur, en théorie, il est possible que les indicateurs de largeur variables se gâtent, ce qui peut avoir pour résultat de hosing des données d'une mauvaise manière.

maintenant le principal inconvénient de la largeur fixe est qu'elle gaspille plus d'espace. Par exemple, vous devez utiliser les champs CHAR au lieu des champs VARCHAR, donc vous finissez 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 quelques varchar's ou un seul blob / texte pour essayer d'optimiser vers ceci. Par exemple, envisager de changer le seul varchar dans un char, ou de diviser la tache dans sa propre table.

Vous pouvez en lire plus à propos de ceci:

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

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

56
répondu Harrison Fisk 2014-11-27 15:45:28

une différence clé se produit lorsque vous mettez à jour un enregistrement. Si le format de la ligne est fixe, il n'y a aucun changement dans la longueur de l'enregistrement. Par contre, si le format de la ligne est dynamique et que les nouvelles données font augmenter la longueur de l'enregistrement, un lien est utilisé pour pointer vers les données "overflow" (c'est-à-dire qu'on l'appelle le pointeur de débordement).

cela fragmente la table et ralentit généralement les choses. Il y a une commande pour defragment (optimiser la TABLE), qui atténue quelque peu le question.

10
répondu Ben Hoffstein 2008-09-29 02:32:48

cette page dans la documentation de MySQL semble contredire la réponse supérieure ici, dans ce format de ligne dynamique signifie quelque chose pour les tables InnoDB aussi bien:

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

7
répondu B T 2012-02-14 19:56:25

Fixe signifie que chaque ligne est exactement de la même taille. Cela signifie que si la 3ème rangée sur une page de données doit être chargée, elle sera à exactement PageHeader+2*RowSize, économisant un peu de temps d'accès.

afin de trouver le début d'une dynamique, la liste d'enregistrement des décalages doivent être consultées, ce qui implique une indirection supplémentaire.

en bref, oui, il y a un léger succès de performance pour les rangées dynamiques. Non, il n'est pas très grande. Si vous pensez que ce sera un problème, test pour elle.

4
répondu Jonathan Rupp 2008-09-29 02:30:46

Fixe devrait être plus rapide et plus sécurisé que dynamique, avec l'inconvénient d'avoir fixé la char-longueur. Vous trouverez cette information ici:http://dev.mysql.com/doc/refman/5.0/en/static-format.html

1
répondu jmissao 2008-09-29 02:33:10