Question

J'utilise Django et je crée mon CharField ( max_length = 255 ), même si je ne l'intention d'utiliser environ 5 caractères. Est-ce moins efficace? J'ai lu que cela n'a pas vraiment d'importance avec varchar mais lu que ça va économiser de l'espace disque dur pour indiquer que ce dont vous avez besoin.

Était-ce utile?

La solution

En général, varchar (255) exige autant que le stockage varchar (1). Dans chaque cas, la table stocke quelque chose comme un pointeur dans une table de chaîne et une longueur. Par exemple. 4 octets décalés + 1 octets de taille = 5 octets fixes par ligne, juste pour les frais généraux.

Le contenu réel est bien sûr dans la table de chaîne, qui est aussi longtemps que la chaîne de votre magasin en elle. Donc, si vous programmez un nom de 5 lettres dans un varchar (255) champ, il utilisera uniquement (par exemple) 5 octets généraux + 5 octets de contenu = 10 octets.

L'utilisation d'un varchar (10) terrain utilisera exactement la même quantité, mais ne tronque les chaînes de plus de 10 octets.


Bien sûr, les chiffres spécifiques dépendent de la mise en œuvre du moteur de stockage.

Autres conseils

Un varchar ne prendra pas plus de place que la chaîne que vous stockez en elle, en dehors de la tête pour mémoriser la longueur de chaîne :

+------------------------------------------+---------------------------------+
| Value      | CHAR(4)    Storage Required | VARCHAR(4)   Storage Required   |  
+------------+-----------------------------+---------------------------------+
| ''         | '    '     4 bytes          | ''           1 byte             |
| 'ab'       | 'ab  '     4 bytes          | 'ab'         3 bytes            | 
| 'abcd'     | 'abcd'     4 bytes          | 'abcd'       5 bytes            |
| 'abcdefgh' | 'abcd'     4 bytes          | 'abcd'       5 bytes            |
+------------+-----------------------------+---------------------------------+

Cependant, si vous avez besoin ne vraiment que 5 caractères, puis envisager d'utiliser char (5) s'il n'y a pas d'autres colonnes de largeur variable dans la table (à savoir, Varchars, texte ou blobs). Ensuite, vous aurez enregistrement de longueur fixe, qui comporte certains avantages de performance :

  

Pour les tables qui changent   souvent, vous devriez essayer d'éviter   toutes les colonnes de longueur variable (VARCHAR,   Blob et du texte). Les utilisations de table   dynamique format de ligne si elle inclut même   une colonne unique de longueur variable. Voir   Chapitre 13, Moteurs de.

Une mise en garde sur l'utilisation de caractère au lieu de varchar est que le jeu de caractères affecte l'espace qui doit être alloué. Par exemple, si le jeu de caractères pour cette colonne est UTF8, alors il est possible que 3 octets seront nécessaires pour stocker un seul caractère.

Depuis un résultat de colonne char dans une allocation de taille fixe quel que soit ce qui est stocké, la base de données doit accueillir le pire des cas. Donc, MySQL doit toujours allouer 15 octets par ligne pour ce char (5) colonne, même si vous avez réellement stocker seulement 5 caractères octet dans chaque ligne.

Un varchar utilise tout ce qui est nécessaire pour chaque ligne comme il est stocké, de sorte que ces mêmes 5 caractères octet prendre jusqu'à seulement 6 ou 7 octets. L'octet supplémentaire ou deux sont pour le suivi de la longueur réelle. Pour une varchar de largeur jusqu'à 255 dans un caractère seul octet, MySQL a besoin d'allouer seulement 1 octet pour stocker la largeur réelle. A varchar de largeur 256 à 65.535 besoins 2 octets pour stocker la longueur, en supposant que le jeu de caractères à un octet.

Depuis un varchar utf8 (255) peut nécessiter 255 * 3 octets de stockage, MySQL doit allouer 2 octets pour stocker la longueur. Une grande partie de cette information est couvert dans le MySQL docs ici .

Bien que vous pouvez déclarer une largeur de 65535, la taille effective max en octets est 65532. Toutefois, en fonction du jeu de caractères et les caractères que vous stockez, vous pouvez stocker un maximum de beaucoup moins de caractères multi-octets que cela.

Comme Paul souligne, cependant, vous voudrez peut-être encore utiliser char si cela permettrait à l'ensemble de la ligne à largeur fixe. Entre autres choses, certaines cherche peut être plus rapide (par exemple, sauter les 1000 premiers rangs) en raison du décalage fixe.

Il y a aussi des problèmes de performance à prendre en compte dans les mises à jour à la colonne. Si vous avez un char (5) et commencer par 1 caractère puis mettez à jour la valeur à 5 caractères, la ligne peut être mis à jour en place. Avec un varchar, en fonction de la mise en œuvre du moteur de stockage, la ligne entière peut devoir être réécrites dans un nouvel emplacement.

Enfin, si MySQL a besoin de créer une table temporaire en mémoire pour trier un jeu de résultats de votre table persistante, il utilise des enregistrements de longueur fixe. Il attribue donc beaucoup plus d'espace dans la mémoire pour les colonnes surdimensionnés varchar que vous pourriez avoir pensé. Ceci est couvert dans la documentation MySQL pour les tables de moteur de stockage de la mémoire. Je crois que MySQL fait aussi pour les tris sur disque.

espace disque dur est pas cher, mais l'espace de cache du processeur est cher. Vous pouvez adapter les champs plus petits que les grands champs.

Au lieu d'utiliser un grand espace inutilement, utiliser l'espace qui non seulement vous donner plus de place de stockage, mais aussi une vitesse d'exécution rapide car il n'a pas besoin de lire tous les caractères. Si vous allouez varchar (255) et d'ajouter du texte 'abc', il lira le caractère 'a', 'b', 'c' et d'autres comme un espace.

Alors, utilisez toujours l'espace nécessaire u au lieu de garder l'espace max.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top