Dans MyISAM, il y a des avantages à créer des enregistrements à largeur fixe. VARCHAR est de largeur variable. CHAR est à largeur fixe. Si vos lignes ne contiennent que des types de données à largeur fixe, la ligne entière est à largeur fixe et MySQL gagne un certain avantage en calculant les besoins en espace et le décalage des lignes dans cette table. Cela dit, l'avantage peut être faible et cela ne vaut guère un petit gain possible qui est compensé par d'autres coûts (tels que l'efficacité du cache) d'avoir des colonnes CHAR rembourrées à largeur fixe où VARCHAR stockerait de manière plus compacte.
Le point d'arrêt où il devient plus efficace dépend de votre application, et ce n'est pas quelque chose qui peut être résolu sauf en testant les deux solutions et en utilisant celle qui fonctionne le mieux pour vos données sous l'utilisation de votre application.
En ce qui concerne INT(7) par rapport à INT(11), cela n'a aucun rapport avec le stockage ou les performances. C'est un malentendu courant que l'argument de MySQL au type INT a quelque chose à voir avec la taille des données - ce n'est pas le cas. Le type de données INT de MySQL est toujours de 32 bits. L'argument entre parenthèses fait référence au nombre de chiffres à remplir si vous affichez la valeur avec ZEROFILL. Par exemple. INT(7) affichera 0001234 où INT(11) affichera 00000001234. Mais ce rembourrage ne se produit que lorsque la valeur est affichée, pas pendant le stockage ou le calcul mathématique.