Vous devez réaliser les compromis liés à l'utilisation de CHAR vs VARCHAR.
Avec les champs CHAR, ce que vous allouez correspond exactement à ce que vous obtenez. Par exemple, CHAR (15) alloue et stocke 15 octets, quelle que soit la manière dont les caractères sont placés dans le champ. La manipulation des chaînes est simple et directe car la taille du champ de données est totalement prévisible.
Avec les champs VARCHAR, vous obtenez une histoire complètement différente. Par exemple, VARCHAR (15) alloue de manière dynamique jusqu'à 16 octets, jusqu'à 15 pour les données et au moins un octet supplémentaire pour stocker la longueur des données. Si vous avez la chaîne 'hello' à stocker qui prendra 6 octets, pas 5. La manipulation de chaîne doit toujours effectuer une vérification de la longueur dans tous les cas.
Le compromis est plus évident lorsque vous faites deux choses:
1. Stocker des millions ou des milliards de lignes
2. Indexer des colonnes qui sont CHAR ou VARCHAR
TRADEOFF # 1
De toute évidence, VARCHAR présente l'avantage, car les données de longueur variable produiraient des lignes plus petites et, par conséquent, des fichiers physiques plus petits.
TRADEOFF # 2
Étant donné que les champs CHAR nécessitent moins de manipulation de chaîne en raison de leur largeur fixe, les recherches d'index par rapport au champ CHAR sont en moyenne 20% plus rapides que celles des champs VARCHAR. Ce n'est pas une conjecture de ma part. Le livre MySQL Database Design and Tuning a prouvé quelque chose de merveilleux sur une table MyISAM. L'exemple dans le livre a quelque chose comme:
ALTER TABLE tblname ROW_FORMAT=FIXED;
Cette directive oblige les VARCHAR à se comporter comme des CHAR. En 2007, lors de mon travail précédent, je m'étais occupé de cette tâche en prenant une table de 300 Go et en accélérant les recherches d'index de 20%, sans rien changer d'autre. Cela a fonctionné comme publié. Cependant, il a produit une table presque deux fois plus grande, mais cela revient tout simplement au compromis # 1.
Vous pouvez analyser les données stockées pour voir ce que MySQL recommande pour la définition des colonnes. Il suffit de lancer ce qui suit contre n’importe quelle table:
SELECT * FROM tblname PROCEDURE ANALYSE();
Cela traversera la table entière et recommandera des définitions de colonne pour chaque colonne en fonction des données qu'elle contient, des valeurs de champ minimales, des valeurs de champs maximales, etc. Parfois, il suffit de faire preuve de bon sens lors de la planification de CHAR vs VARCHAR. Voici un bon exemple:
Si vous stockez des adresses IP, le masque d'une telle colonne contient au maximum 15 caractères (xxx.xxx.xxx.xxx). Je sauterais directement dans CHAR (15) car les longueurs d'adresses IP ne varieraient pas beaucoup et la complexité supplémentaire de la manipulation de chaîne contrôlée par un octet supplémentaire. Vous pouvez toujours faire une PROCEDURE ANALYSE () avec une telle colonne. Il peut même recommander VARCHAR. Mon argent serait toujours sur CHAR sur VARCHAR dans ce cas.
Les problèmes CHAR vs VARCHAR ne peuvent être résolus que par une planification appropriée. Avec un grand pouvoir vient une grande responsabilité (cliché mais vrai)