web-dev-qa-db-fra.com

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 raisonnables:

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

Une clarification par exemple. Disons que j'ai un champ varchar de 20 caractères. MySQL, lors de la création de ce champ, réserve-t-il essentiellement de l'espace pour 32 octets (vous ne savez pas si ce sont des octets ou non), mais ne permet que la saisie de 20?

Je suppose que je m'inquiète d'optimiser l'espace disque pour une table massive.

65
ae.

Pour répondre à la question, sur le disque MySql utilise 1 + la taille utilisée dans le champ pour stocker les données (donc si la colonne a été déclarée varchar (45), et le champ était "FooBar", il utiliserait 7 octets sur le disque, à moins bien sûr que vous n'utilisiez un jeu de caractères multi-octets, où il utiliserait 14 octets). Donc, quelle que soit la façon dont vous déclarez vos colonnes, cela ne fera aucune différence du côté du stockage (vous avez déclaré que vous vous inquiétiez de l'optimisation du disque pour une table massive). Cependant, cela fait une différence dans les requêtes, car les VARCHAR sont convertis en CHAR lorsque MySql crée une table temporaire (SORT, ORDER, etc.) et plus vous pouvez insérer d'enregistrements dans une seule page, moins de mémoire et plus rapide vos analyses de table être.

55
Kris Erickson

MySQL stocke un champ varchar sous la forme d'un enregistrement de longueur variable, avec un préfixe d'un octet ou de deux octets pour indiquer la taille de l'enregistrement.

Avoir un modèle de tailles de stockage ne fait pas vraiment de différence sur la façon dont MySQL fonctionnera lors du stockage des enregistrements de longueur variable. La longueur spécifiée dans une déclaration varchar (x) déterminera simplement la longueur maximale des données pouvant être stockées. Fondamentalement, un varchar (16) n'est pas différent sur le disque d'un varchar (128).

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

Edit: En ce qui concerne votre question mise à jour, la réponse est toujours la même. Un champ varchar n'utilisera autant d'espace sur le disque que les données que vous y stockez (plus une surcharge d'un ou deux octets). Donc, peu importe si vous avez un varchar (16) ou un varchar (128), si vous y stockez une chaîne de 10 caractères, vous n'utiliserez que 10 octets (plus 1 ou 2) d'espace disque .

24
zombat