J'ai un tableau avec 2 colonnes. Le type des deux colonnes est défini sur varchar(38)
. Si je crée une ligne avec une valeur vide pour l'une des colonnes, cela prendra-t-il le même espace de stockage que si la valeur n'était pas vide?
En d'autres termes, MySQL réservera-t-il de l'espace de stockage pour la colonne (selon son type) lors de la création d'une ligne?
À partir de Innodb Physical Row Structure, bulletpoint # 7 under REDUNDANT ROW_FORMAT
Une valeur SQL NULL réserve un ou deux octets dans le répertoire d'enregistrement. En plus de cela, une valeur SQL NULL réserve zéro octet dans la partie données de l'enregistrement si elle est stockée dans une colonne de longueur variable. Dans une colonne de longueur fixe, elle réserve la longueur fixe de la colonne dans la partie données de l'enregistrement. La réservation de l'espace fixe pour les valeurs NULL permet de mettre à jour la colonne de NULL vers une valeur non NULL sans provoquer de fragmentation de la page d'index.
À partir de Innodb Physical Row Structure, puce n ° 2 sous COMPACT ROW_FORMAT
La partie de longueur variable de l'en-tête d'enregistrement contient un vecteur de bits pour indiquer les colonnes NULL. Si le nombre de colonnes de l'index qui peut être NULL est N, le vecteur de bits occupe les PLAFONDS (N/8) octets. (Par exemple, s'il existe entre 9 et 15 colonnes pouvant être NULL, le vecteur binaire utilise deux octets.) Les colonnes NULL n'occupent pas d'espace autre que le peu dans ce vecteur. La partie de longueur variable de l'en-tête contient également les longueurs des colonnes de longueur variable. Chaque longueur prend un ou deux octets, selon la longueur maximale de la colonne. Si toutes les colonnes de l'index ne sont PAS NULES et ont une longueur fixe, l'en-tête d'enregistrement n'a pas de partie de longueur variable.
Sur la base de ces puces, voici ce qu'une valeur NULL
prend pour le stockage d'une colonne
Maintenant, vous devez décider entre utiliser CHAR et VARCHAR en raison de ce que le premier point a fait ressortir
La réservation de l'espace fixe pour les valeurs NULL permet de mettre à jour la colonne de NULL vers une valeur non NULL sans provoquer de fragmentation de la page d'index
Cela empêchera toute fragmentation d'une ligne qui descendra une fois les données non NULL stockées. C'est quelque chose que j'ai discuté auparavant en ce qui concerne MyISAM: Voir mon ancien article Quel est l'impact sur les performances de l'utilisation de CHAR vs VARCHAR sur un champ de taille fixe? .
Quelle que soit la longueur que vous définissez pour votre colonne varchar, l'espace de stockage utilisé par une colonne vide sera le même.
Cela ne concerne que l'espace utilisé par la colonne varchar et ne prend pas en compte l'espace de stockage total utilisé par la ligne, ses index, ses clés primaires et autres colonnes.
Comme ypercube le mentionne dans son commentaire, il existe des considérations supplémentaires pour le stockage des lignes dans son ensemble lorsqu'au moins une colonne nullable est présente.
Structure physique des rangées Innodb
La partie de longueur variable de l'en-tête d'enregistrement contient un vecteur de bits pour indiquer les colonnes NULL. S'il y a de 9 à 15 colonnes pouvant être NULL, le vecteur binaire utilise deux octets.)
...
La partie de longueur variable de l'en-tête contient également les longueurs des colonnes de longueur variable. Chaque longueur prend un ou deux octets, selon la longueur maximale de la colonne. Si toutes les colonnes de l'index ne sont PAS NULES et ont une longueur fixe, l'en-tête d'enregistrement n'a pas de partie de longueur variable
Et oui, l'espace de stockage utilisé change en fonction du type que vous choisissez, est-il fixe ou variable, le classement et d'autres facteurs tels que le moteur.
MySQL fait des recommandations sur l'optimisation du stockage des données ici: Optimizing Data Size
Mise à jour
Une considération supplémentaire avec varchar et c'est la mémoire. Il est important dans MySQL de limiter autant que possible la taille d'une colonne de longueur variable. Même si la colonne est variable et l'espace de stockage utilisé est variable, MySQL alloue de la mémoire en morceaux fixes pour stocker les valeurs. Par exemple, varchar (200) utilisera plus de mémoire que varchar (5). Ce n'est pas un problème d'espace de stockage, mais quelque chose à considérer lors de la définition de vos colonnes.