MySQL Format de Ligne: Différence entre fixe et dynamique?
MySQL spécifie le format de ligne d'une table comme fixes ou dynamiques, selon les types de données des colonnes. Si une table a une longueur variable de la colonne type de données, tels que du TEXTE ou de type VARCHAR, le format de ligne dynamique; sinon, c'est corrigé.
Ma question est, quelle est la différence entre les deux formats de ligne? Est un de plus efficace que l'autre?
Vous devez vous connecter pour publier un commentaire.
La différence vraiment uniquement les questions pour MyISAM, d'autres moteurs de stockage ne se soucient pas de la différence.
EDIT : de Nombreux utilisateurs ont estimé que InnoDB n'soins: lien 1 par steampowered, lien 2 en Kaan.
Avec MyISAM avec une largeur fixe de lignes, il y a quelques avantages:
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.
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.
Plus faciles à 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
Une différence essentielle se produit lorsque vous mettez à jour un enregistrement. Si le format de la ligne est fixe, il n'y a pas de changement dans la longueur de l'enregistrement. En revanche, si le format de la ligne est dynamique et les nouvelles données provoque l'enregistrement de l'augmentation de la longueur, un lien est utilisé pour pointer vers le "dépassement" de données (c'est à dire qui s'appelle le dépassement de pointeur).
Ce fragments de la table et généralement ralentit les choses. Il existe une commande pour défragmenter (OPTIMIZE TABLE), ce qui atténue quelque peu la question.
Cette page dans la documentation de MySQL semble contredire le haut de réponse ici, dans cette DYNAMIQUE de format de ligne signifie quelque chose pour les tables InnoDB ainsi:
https://dev.mysql.com/doc/refman/5.7/en/innodb-row-format.html
Fixe signifie que chaque ligne est exactement de la même taille. Cela signifie que si la 3e rangée sur une page de données a besoin d'être chargées, il sera exactement l'entête de page+2*RowSize, en épargnant le 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 gain de performance pour des lignes dynamiques. Non, il n'est pas très grande. Si vous pensez que ce sera un problème, test pour elle.
Fixe devrait être plus rapide et plus sécurisé que dynamique, avec l'inconvénient d'avoir fixé la char-longueur.
Vous pouvez trouver cette information ici: http://dev.mysql.com/doc/refman/5.0/en/static-format.html