882 votes

MySQL : Grand VARCHAR vs. TEXT ?

J'ai une table de messages dans MySQL qui enregistre des messages entre utilisateurs. En dehors des ids et des types de messages typiques (tous des types entiers), j'ai besoin de sauvegarder le texte du message réel en tant que VARCHAR ou TEXT. Je fixe une limite côté front-end de 3000 caractères, ce qui signifie que les messages ne seront jamais insérés dans la base de données avec une longueur supérieure à cela.

Y a-t-il une justification pour choisir entre VARCHAR(3000) ou TEXT ? Il y a quelque chose à propos d'écrire simplement VARCHAR(3000) qui semble quelque peu contre-intuitif. J'ai parcouru d'autres publications similaires sur Stack Overflow mais ce serait bien d'obtenir des points de vue spécifiques à ce type de stockage de messages courant.

33 votes

Un peu vieux, mais je suis venu ici parce que je suis tombé sur un problème qui m'a fait réfléchir à cela. Dans mon cas, mon formulaire front-end était limité à 2 000 caractères, mais le codage implicite dans ma méthode de stockage encodait les caractères internationaux sous forme de plusieurs caractères (ce qui peut apparemment varier de 3 à 12 par caractère). Ainsi, mes 2 000 caractères deviennent soudainement jusqu'à 24 000. Quelque chose à méditer...

3 votes

J'ai trouvé que le texte était significativement plus rapide pour de nombreuses insertions concurrentes.

1 votes

@JamesS: utf8mb4... >.< @JamesS: utf8mb4... >.<

7voto

Max Points 148

Les réponses précédentes n'insistent pas assez sur le principal problème: même dans des requêtes très simples comme

(SELECT t2.* FROM t1, t2 WHERE t2.id = t1.id ORDER BY t1.id) 

une table temporaire peut être requise, et si un champ VARCHAR est impliqué, il est converti en un champ CHAR dans la table temporaire. Donc, si vous avez dans votre table disons 500 000 lignes avec un champ VARCHAR(65000), cette colonne seule utilisera 6.5*5*10^9 octets. De telles tables temporaires ne peuvent pas être gérées en mémoire et sont écrites sur le disque. L'impact peut être catastrophique.

Source (avec des mesures): https://nicj.net/mysql-text-vs-varchar-performance/ (Cela concerne le traitement de TEXT vs VARCHAR dans le moteur de stockage MyISAM "standard"(?). Cela peut être différent dans d'autres moteurs, par exemple InnoDB.)

3 votes

InnoDB : La même chose s'applique jusqu'à la version 5.7. Avec 8.0, les varchar temps sont de longueur variable.

4voto

Creative87 Points 115

Varchar est destiné aux petites données telles que les adresses e-mail, tandis que Text est adapté pour des données beaucoup plus importantes comme des articles d'actualité, Blob pour des données binaires telles que des images.

Les performances de Varchar sont plus puissantes car elles s'exécutent entièrement en mémoire, mais ce ne sera pas le cas si les données sont trop importantes comme par exemple varchar(4000).

Text, en revanche, ne reste pas en mémoire et est affecté par les performances du disque, mais vous pouvez éviter cela en séparant les données textuelles dans une table séparée et en appliquant une requête de jointure gauche pour récupérer les données textuelles.

Blob est beaucoup plus lent, alors utilisez-le seulement si vous n'avez pas beaucoup de données comme par exemple 10000 images qui coûteront 10000 enregistrements.

Suivez ces conseils pour une vitesse et des performances maximales :

  1. Utilisez varchar pour les noms, les titres, les e-mails

  2. Utilisez Text pour des données volumineuses

  3. Séparez les textes dans différentes tables

  4. Utilisez des requêtes de jointure gauche sur un ID tel qu'un numéro de téléphone

  5. Si vous allez utiliser Blob, appliquez les mêmes conseils que pour Text

Cela rendra les requêtes coûter des millisecondes sur des tables avec des données >10 M et une taille allant jusqu'à 10 Go garantie.

4voto

Viktor Joras Points 315

Il y a une ÉNORME différence entre VARCHAR et TEXT. Alors que les champs VARCHAR peuvent être indexés, les champs TEXT ne le peuvent pas. Les champs de type VARCHAR sont stockés en ligne tandis que les champs TEXT sont stockés hors ligne, seuls des pointeurs vers les données TEXT étant effectivement stockés dans les enregistrements.

Si vous devez indexer votre champ pour une recherche, une mise à jour ou une suppression plus rapide, alors optez pour VARCHAR, peu importe sa taille. Un VARCHAR(10000000) ne sera jamais identique à un champ TEXT car ces deux types de données sont différents par nature.

  • Si vous utilisez votre champ uniquement pour archiver
  • vous vous moquez de la vitesse de récupération des données
  • vous vous souciez de la vitesse mais vous utiliserez l'opérateur '%LIKE%' dans votre requête de recherche donc l'indexation ne servira pas à grand chose
  • vous ne pouvez pas prédire une limite de longueur des données

alors optez pour TEXT.

0 votes

Information partiellement trompeuse : les colonnes TEXT ne peuvent pas être indexées dans leur intégralité. Lorsque vous incluez une colonne TEXT dans l'index, vous devez spécifier la longueur. De plus, les VARCHARs ne peuvent pas être indexés dans leur intégralité dans le cas des VARCHARs > 255 car il y a une longueur maximale sur la taille de l'index.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X