73 votes

Quelles sont les tailles optimales de varchar pour MySQL?

Comment MySQL stocke-t-il un champ varchar? Puis-je supposer que le modèle suivant représente des tailles de stockage sensibles:

1,2,4,8,16,32,64,128,255 (max)

Une clarification via exemple. Disons que j'ai un champ varchar de 20 caractères. Est-ce que MySQL, lors de la création de ce champ, réserve en principe de l'espace pour 32 octets (ne sait pas s'il s'agit d'octets ou non) mais autorise seulement 20 à être entré?

Je suppose que je suis préoccupé par l'optimisation de l'espace disque pour une table massive.

61voto

Kris Erickson Points 16204

Pour répondre à la question, sur le disque MySql utilise 1 + la taille qui est utilisé dans le domaine de stocker les données (donc si la colonne a été déclaré varchar(45), et le terrain était "FooBar" seraient les 7 octets sur le disque, à moins bien sûr d'où l'utilisation d'un jeu de caractères multioctets, où il serait à l'aide de 14 octets). Si, toutefois, vous déclarez vos colonnes, il l'habitude de faire une différence sur le stockage de fin (vous l'avez dit vous êtes inquiet au sujet de l'optimisation du disque pour une table massive). Cependant, il y a une différence dans les requêtes, comme VARCHAR sont convertis CHAR lorsque MySql rend une table temporaire (TRI, de l'ORDRE, etc) et le plus d'enregistrements que vous pouvez tenir dans une seule page, moins de mémoire et plus rapide de votre table de scans seront.

27voto

zombat Points 46702

MySQL stocke un champ de type varchar comme une variable enregistrement de longueur, avec soit un octet deux octets de préfixe pour indiquer la taille d'enregistrement.

Avoir un modèle de tailles de stockage n'a pas vraiment faire une différence à la façon dont MySQL fonctionne lorsque vous traitez avec le stockage d'enregistrements de longueur variable. La longueur spécifiée dans un varchar(x) déclaration suffit de déterminer la longueur maximale des données qui peuvent être stockées. Fondamentalement, un varchar(16) n'est pas différent de disque-sage qu'un varchar(128).

Cette page de manuel a une explication plus détaillée.

Edit: quant à la mise à jour de votre question, la réponse est toujours la même. Un champ de type varchar ne utiliser autant d'espace disque que les données que vous stockez dans celui-ci (plus un ou deux octets de surdébit). Donc, il n'a pas d'importance si vous avez un varchar(16) ou varchar(128), si vous stockez un 10-chaîne de caractères, vous n'utilisez que 10 octets (plus 1 ou 2) de l'espace disque.

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