Vous devriez essayer d'afficher une colonne varchar de la même manière qu'une colonne char dans la plupart des scénarios et définir la longueur de manière prudente. Vous ne devez pas toujours penser au modificateur var comme à quelque chose qui a un impact sur votre prise de décision sur la longueur maximale. Cela devrait vraiment être considéré comme un indice de performance au lieu de cela que les cordes fournies seront de longueurs variables.
Ce n'est pas une directive qui doit être strictement suivie par les internes de la base de données, elle peut être complètement ignorée. Faites attention avec ceci cependant car parfois l'implémentation peut fuir (longueur et remplissage fixes par exemple) même si elle ne devrait pas dans un monde idéal.
Si vous avez un varchar (255), vous n'avez aucune garantie que, en termes de performances, il se comportera toujours différemment d'un char (255) en toutes circonstances.
Il peut sembler facile de le définir à quelque chose comme 255, 65535, etc. en conformité avec les conseils donnés dans le manuel sur les exigences de stockage. Cela donne l'impression que toute valeur comprise entre 0 (oui, c'est une chose) et 255 aura le même impact. Cependant, ce n'est pas quelque chose qui peut être entièrement garanti.
Les exigences de stockage ont tendance à être vraies ou à être un bon indicateur de moteurs de stockage persistants décents et matures en termes de stockage en ligne. Ce n'est pas un indicateur aussi fort pour des choses comme les index.
C'est parfois une question difficile, combien de temps exactement un morceau de ficelle doit-il durer pour le configurer à la limite la plus élevée que vous savez qu'il devrait être à l'intérieur, mais cela n'a aucun impact. Malheureusement, cela revient souvent à l'utilisateur de travailler et c'est vraiment quelque peu arbitraire. Vous ne pouvez pas vraiment dire de ne jamais surdimensionner une chaîne, car il peut y avoir des cas où vous n'êtes pas vraiment sûr.
Vous devez vous assurer que les requêtes MySQL génèrent une erreur lorsqu'une chaîne est trop longue plutôt que tronquée afin qu'au moins vous sachiez si elle pourrait être trop courte à cause des émissions d'erreur. Le redimensionnement des colonnes pour les agrandir ou les réduire peut être une opération DDL coûteuse, cela doit être gardé à l'esprit.
Le jeu de caractères doit également être pris en compte lorsque la longueur et les performances entrent en jeu. La longueur fait référence à cela plutôt qu'aux octets. Si vous utilisez utf8 par exemple (et non MB4), alors varchar (255) est vraiment varbinary (3 * 255). Il est difficile de savoir comment des choses comme celles-ci se dérouleront vraiment sans exécuter de tests et sans examiner en profondeur le code source / la documentation. Pour cette raison, il est possible qu'une longueur excessive ait un impact gonflé de manière inattendue. cela ne s'applique pas uniquement aux performances. Si vous avez un jour besoin de changer le jeu de caractères d'une colonne varchar en un plus grand, vous pourriez finir par atteindre une limite sans recours si vous avez autorisé la présence de chaînes longues gratuitement, ce qui aurait pu être évité. C'est normalement un problème assez spécifique, mais il se pose,
S'il s'avère que MAX (LENGTH (colonne)) est toujours <64 (par exemple s'il était décidé qu'il y aurait une limite d'entrée qui ne correspond pas à la définition de colonne) mais que vous avez varchar (255) alors il y a un il y a de fortes chances que vous utilisiez quatre fois plus d'espace que nécessaire dans certains scénarios.
Cela peut inclure:
- Différents moteurs, certains peuvent l'ignorer complètement.
- Les tailles de tampon, par exemple la mise à jour ou l'insertion, peuvent devoir allouer le 255 complet (bien que je n'ai pas vérifié le code source pour le prouver, ce n'est qu'une hypothèse).
- Index, ce sera immédiatement évident si vous essayez de créer une clé composite à partir de nombreuses colonnes varchar (255).
- Tables intermédiaires et éventuellement ensembles de résultats. Étant donné le fonctionnement des transactions, il n'est pas toujours possible pour quelque chose d'utiliser la longueur maximale réelle des chaînes dans une colonne par opposition à la limite définie.
- Les optimisations prédictives internes peuvent prendre la longueur maximale comme entrée.
- Changements dans les versions d'implémentation de la base de données.
En règle générale, il n'est vraiment pas nécessaire qu'un varchar soit plus long que nécessaire, que ce soit des problèmes de performances ou non, je vous recommande donc de vous en tenir à cela lorsque vous le pouvez. Faire plus d'efforts pour échantillonner la taille de vos données, appliquer une vraie limite ou découvrir la vraie limite en demandant / en recherchant est l'approche idéale.
Lorsque vous ne pouvez pas, si vous voulez faire quelque chose comme varchar (255) pour les cas de doute, je vous recommande de faire de la science. Cela peut consister à dupliquer la table, à réduire la taille de la colonne var char, puis à y copier les données à partir de l'original et à examiner la taille des données d'index / ligne (indexez également la colonne, essayez-la également comme clé primaire qui peuvent se comporter différemment dans InnoDB car les lignes sont triées par clé primaire). Au moins de cette façon, vous saurez si vous avez un impact sur les E / S, qui a tendance à être l'un des goulots d'étranglement les plus sensibles. Tester l'utilisation de la mémoire est plus difficile, il est difficile de le tester de manière exhaustive. Je recommanderais de tester les pires cas potentiels (requêtes avec beaucoup de résultats intermédiaires dans la mémoire, vérifiez avec Expliquer les grandes tables temporaires, etc.).
Si vous savez qu'il n'y aura pas beaucoup de lignes dans la table, vous n'allez pas utiliser la colonne pour les jointures, les index (en particulier composite, unique), etc., vous n'aurez probablement pas beaucoup de problèmes.
VARCHAR(255) utf8mb4
colonne indexée avec ~ 150 000 lignes mesurait 11,5 Mo. Une table avec uneVARCHAR(48) utf8mb4
colonne indexée avec les mêmes données (longueur maximale 46 caractères) a utilisé 4,5 Mo. Pas vraiment une grande différence dans les requêtes, il est indexé. Mais cela s'additionne avec les E / S de requête et des choses comme les sauvegardes de base de données.