Question MySQL: Grand VARCHAR contre TEXT?


J'ai une table de messages dans MySQL qui enregistre les messages entre les utilisateurs. En dehors des identifiants et types de message typiques (tous les types entiers), j'ai besoin de sauvegarder le texte du message en tant que VARCHAR ou TEXT. Je définis une limite frontale de 3000 caractères, ce qui signifie que les messages ne seront jamais insérés dans la base de données plus longtemps.

Y a-t-il une raison pour utiliser VARCHAR (3000) ou TEXT? Il y a quelque chose à propos de l'écriture de VARCHAR (3000) qui semble quelque peu contre-intuitif. J'ai déjà lu d'autres articles similaires sur Stack Overflow, mais je serais content d'avoir des vues spécifiques à ce type de message commun.


758
2018-01-07 20:40


origine


Réponses:


  • TEXT et BLOB est stocké hors de la table avec la table ayant juste un pointeur vers l'emplacement du stockage réel.

  • VARCHAR est stocké en ligne avec la table. VARCHAR est plus rapide lorsque la taille est raisonnable, dont le compromis serait plus rapide dépend de vos données et de votre matériel, vous voulez comparer un scénario réel avec vos données.

Mettre à jour Qu'il s'agisse VARCHAR ou TEXT est stocké en ligne, ou hors enregistrement dépend de la taille des données, de la taille des colonnes, du format de la ligne et de la version de MySQL. Cela fait ne pas dépend de "texte" vs "varchar".


759
2018-01-07 20:45



Pouvez-vous prédire combien de temps l'entrée de l'utilisateur serait?

VARCHAR (X)

Cas: nom d'utilisateur, email, pays, sujet, mot de passe


TEXTE

Cas: messages, emails, commentaires, texte formaté, html, code, images, liens


MEDIUMTEXT

Cas: grands corps de json, livres de courte à moyenne longueur, chaînes de CSV


LONGTEXT

Cas: manuels, programmes, années de fichiers journaux, Harry Potter et la coupe de feu, journalisation de la recherche scientifique


415
2017-11-01 17:56



Juste pour clarifier la meilleure pratique:

  1. Les messages au format texte devraient presque toujours être stockés sous TEXT (ils sont arbitrairement longs)

  2. Les attributs de chaîne doivent être stockés en tant que VARCHAR (le nom d'utilisateur de destination, le sujet, etc ...).

Je comprends que vous ayez une limite initiale, ce qui est excellent jusqu'à ce que ce ne soit pas le cas. * grin * L'astuce consiste à considérer la base de données comme distincte des applications qui s'y connectent. Ce n'est pas parce qu'une application impose une limite aux données que les données sont intrinsèquement limitées.

Qu'y a-t-il dans les messages eux-mêmes qui les obligent à ne jamais dépasser les 3000 caractères? Si c'est juste une contrainte d'application arbitraire (par exemple, pour une zone de texte ou quelque chose), utilisez un TEXT champ à la couche de données.


210
2018-01-07 21:53



Disclaimer: Je ne suis pas un expert MySQL ... mais c'est ma compréhension des problèmes.

Je pense que TEXT est stocké en dehors de la ligne mysql, alors que je pense que VARCHAR est stocké dans le cadre de la ligne. Il y a une longueur de ligne maximale pour les lignes mysql .. donc vous pouvez limiter la quantité d'autres données que vous pouvez stocker dans une rangée en utilisant VARCHAR.

Aussi, en raison de VARCHAR faisant partie de la ligne, je soupçonne que les requêtes en regardant ce champ seront légèrement plus rapides que ceux qui utilisent un morceau TEXT.


31
2018-01-07 20:47



Réponse courte:  Pas de différence pratique, de performance ou de stockage.

Longue réponse:

Il n'y a essentiellement aucune différence (en MySQL) entre VARCHAR(3000) (ou toute autre grande limite) et TEXT. Le premier tronquera à 3000 personnages; ce dernier tronquera à 65535 octets. (Je fais une distinction entre octets et personnages car un personnage peut prendre plusieurs octets.)

Pour des limites plus petites dans VARCHAR, il y a quelques avantages sur TEXT.

  • "plus petit" signifie 191, 255, 512, 767 ou 3072, etc., selon la version, le contexte, et CHARACTER SET.
  • INDEXes sont limitées dans la façon dont une colonne peut être indexée. (767 ou 3072 octets; c'est la version et les paramètres dépendants)
  • Tableaux intermédiaires créés par complexe SELECTs sont gérés de deux manières différentes - MEMORY (plus rapide) ou MyISAM (plus lent). Lorsque de «grandes» colonnes sont impliquées, la technique la plus lente est automatiquement sélectionnée. (Modifications importantes à venir dans la version 8.0, donc cet élément de puce est sujet à changement.)
  • En relation avec l'élément précédent, tous TEXT types de données (par opposition à VARCHAR) sautez directement à MyISAM. C'est, TINYTEXT est automatiquement pire pour les tables temporaires générées que l'équivalent VARCHAR. (Mais cela prend la discussion dans une troisième direction!)
  • VARBINARY est comme VARCHAR; BLOB est comme TEXT.

Réfutation à d'autres réponses

La question initiale a demandé une chose (quel type de données utiliser); la réponse acceptée a répondu à autre chose (stockage hors enregistrement). Cette réponse est maintenant périmée.

Quand ce fil a été démarré et répondu, il n'y avait que deux "formats de lignes" dans InnoDB. Peu de temps après, deux autres formats (DYNAMIC et COMPRESSES) ont été présenté.

L'emplacement de stockage pour TEXT et VARCHAR() est basé sur Taille, pas sur nom du type de données. Pour un actualisé une discussion sur le stockage on / off-record de grandes colonnes text / blob, voir ce .


3
2018-06-25 16:05



Les réponses précédentes n'insistent pas assez sur le problème principal: même dans des requêtes très simples (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 500 000 lignes avec un champ VARCHAR (65000), cette colonne utilisera à elle seule 6,5 * 5 * 10 ^ 9 octets. De telles tables temporaires ne peuvent pas être traitées en mémoire et sont écrites sur le disque. On peut s'attendre à ce que l'impact soit catastrophique.

Source (avec métriques): https://nicj.net/mysql-text-vs-varchar-performance/ (Cela fait référence à la gestion de TEXT par rapport à VARCHAR dans un moteur de stockage MyISAM "standard" (?) Il peut être différent dans d'autres, par exemple, InnoDB.)


1
2018-06-30 21:43