Question

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?

Était-ce utile?

La solution

La différence n’importe vraiment que pour MyISAM, les autres moteurs de stockage ne se soucient pas de la différence. MODIFIER : de nombreux utilisateurs ont déclaré qu'InnoDB était utile: lien 1 par steampowered , lien 2 par Kaan .

Avec MyISAM avec des rangées de largeur fixe, il existe quelques avantages:

  1. Pas de fragmentation des lignes: il est possible avec des lignes de largeur variable d'obtenir des lignes uniques 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 cela 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 utilisé lorsqu'il est nécessaire de référencer le fichier de données. Par exemple, cela est utilisé dans les index lorsqu'ils se réfèrent à l'endroit où la ligne est réellement présente. 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 (les lignes peuvent être 1, 57, 163). Le résultat est qu'avec les grandes tables, le pointeur doit être plus grand, ce qui ajoute potentiellement beaucoup plus de temps système à la table.

  3. Plus facile à réparer en cas de corruption. Comme chaque ligne a la même taille, si votre table MyISAM est corrompue, il est beaucoup plus facile de la réparer. Vous ne perdrez donc que les données réellement corrompues. Avec une largeur variable, il est théoriquement possible que les pointeurs de largeur variable se brouillent, ce qui peut entraîner un mauvais stockage des données.

Maintenant, le principal inconvénient de la largeur fixe est qu’elle gaspille plus d’espace. Par exemple, vous devez utiliser des champs CHAR au lieu de champs VARCHAR pour vous retrouver avec un espace supplémentaire occupé.

Normalement, vous n’avez 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 à essayer pour optimiser cela. Par exemple, envisagez de remplacer le seul varchar par un caractère ou de scinder le blob dans sa propre table.

Vous en saurez plus à ce sujet sur:

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

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

Autres conseils

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 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 sur le "débordement". données (c’est-à-dire qu’il s’appelle le pointeur de débordement).

Ceci 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.

Cette page de la documentation de MySQL semble contredire la réponse principale, car 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

Fixe 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, vous devez 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.

Fixe devrait ê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 / fr / static-format.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top