J'ai une table de messages dans MySQL qui enregistre les messages entre les utilisateurs. Mis à part les identifiants et les types de messages typiques (tous les types entiers), je dois enregistrer le texte du message en tant que VARCHAR ou TEXT. Je fixe 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 que cela.
Y a-t-il une justification pour aller avec VARCHAR (3000) ou TEXT? Il y a quelque chose à propos de l'écriture de VARCHAR (3000) qui semble quelque peu contre-intuitif. J'ai lu d'autres articles similaires sur Stack Overflow, mais ce serait bien d'avoir des vues spécifiques à ce type de stockage de messages courants.
Réponses:
TEXT
etBLOB
peut être stocké hors de la table, la table ayant simplement un pointeur vers l'emplacement du stockage réel. L'endroit où il est stocké dépend de beaucoup de choses comme la taille des données, la taille des colonnes, row_format et la version MySQL.VARCHAR
est stocké en ligne avec la table.VARCHAR
est plus rapide lorsque la taille est raisonnable, dont le compromis serait plus rapide en fonction de vos données et de votre matériel, vous voudriez comparer un scénario réel avec vos données.la source
varchar
etblob
/text
sur InnoDB pour les petits éléments de texte? Alors , serait - il alors juste rendre sage toutvarchar
untext
type et laisser le DB gérer le trop - plein de rapport en ligne?Pouvez-vous prévoir la durée de la saisie utilisateur?
la source
Juste pour clarifier la meilleure pratique:
Les messages au format texte doivent presque toujours être stockés sous forme de texte (ils finissent par être arbitrairement longs)
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 avez une limite avant, ce qui est excellent jusqu'à ce qu'elle ne le soit pas. * sourire * L'astuce consiste à penser la base de données comme distincte des applications qui s'y connectent. Ce n'est pas parce qu'une application limite les données que les données sont intrinsèquement limitées.
En quoi les messages eux-mêmes les obligent-ils à ne jamais dépasser 3000 caractères? S'il s'agit simplement d'une contrainte d'application arbitraire (par exemple, pour une zone de texte ou quelque chose), utilisez un
TEXT
champ au niveau de la couche de données.la source
Avertissement: 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 .. vous pouvez donc limiter la quantité d'autres données que vous pouvez stocker dans une ligne en utilisant le VARCHAR.
En raison également de la présence de VARCHAR dans la ligne, je soupçonne que les requêtes regardant ce champ seront légèrement plus rapides que celles utilisant un morceau TEXT.
la source
varchar
colonne de 3 000 caractères peut prendre jusqu'à 9 000 octets.TEXT
ligne dans le tableau.Réponse courte: Aucune différence pratique, de performance ou de stockage.
Longue réponse:
Il n'y a essentiellement aucune différence (dans MySQL) entre
VARCHAR(3000)
(ou toute autre grande limite) etTEXT
. Le premier tronquera à 3000 caractères ; ce dernier sera tronqué à 65 535 octets . (Je fais une distinction entre octets et caractères car un caractère peut prendre plusieurs octets.)Pour des limites plus petites dans
VARCHAR
, il y a certains avantages par rapport àTEXT
.CHARACTER SET
.INDEXes
sont limités dans la taille d'une colonne pouvant être indexée. (767 ou 3072 octets ; cela dépend de la version et des paramètres)SELECTs
sont gérées 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 cette puce peut être modifiée.)TEXT
types de données (par opposition àVARCHAR
) passent directement à MyISAM. Autrement dit,TINYTEXT
est automatiquement pire pour les tables temporaires générées que l'équivalentVARCHAR
. (Mais cela entraîne la discussion dans une troisième direction!)VARBINARY
est commeVARCHAR
;BLOB
c'est commeTEXT
.Réfutation à d'autres réponses
La question d'origine demandait 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 désormais obsolète.
Lorsque ce thread a été démarré et a répondu, il n'y avait que deux "formats de ligne" dans InnoDB. Peu de temps après, deux autres formats (
DYNAMIC
etCOMPRESSED
) ont été introduits.L'emplacement de stockage pour
TEXT
etVARCHAR()
est basé sur la taille et non sur le nom du type de données . Pour une discussion mise à jour sur le stockage on / off-record de grandes colonnes de texte / blob, voir ceci .la source
Les réponses précédentes n'insistent pas assez sur le problème principal: même dans des requêtes très simples comme
une table temporaire peut être requise, et si un
VARCHAR
champ est impliqué, il est converti en unCHAR
champ dans la table temporaire. Donc, si vous avez dans votre tableau 500 000 lignes avec unVARCHAR(65000)
champ, cette colonne utilisera à elle seule 6,5 * 5 * 10 ^ 9 octets. Ces 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 métriques): https://nicj.net/mysql-text-vs-varchar-performance/ (Il s'agit de la gestion des
TEXT
vsVARCHAR
dans le moteur de stockage MyISAM "standard" (?). Cela peut être différent dans d'autres, par exemple, InnoDB.)la source
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 TEXT est stocké hors ligne, seuls les pointeurs vers les données TEXT sont réellement stockés dans les enregistrements.
Si vous devez indexer votre champ pour une recherche, une mise à jour ou une suppression plus rapide que pour VARCHAR, quelle que soit sa taille. Un VARCHAR (10000000) ne sera jamais identique à un champ TEXT car ces deux types de données sont de nature différente.
que d'aller pour TEXT.
la source
Varchar est pour les petites données comme les adresses e-mail, tandis que Text est pour les données beaucoup plus importantes comme les articles de nouvelles, Blob pour les données binaires telles que les images.
Les performances de Varchar sont plus puissantes car elles s'exécutent complètement à partir de la mémoire, mais ce ne sera pas le cas si les données sont trop volumineuses comme
varchar(4000)
par exemple.Le texte, en revanche, ne colle pas à la mémoire et est affecté par les performances du disque, mais vous pouvez éviter cela en séparant les données de texte dans une table distincte et en appliquant une requête de jointure gauche pour récupérer les données de texte.
Blob est beaucoup plus lent, alors n'utilisez-le que si vous n'avez pas beaucoup de données comme 10000 images qui coûteront 10000 enregistrements.
Suivez ces conseils pour une vitesse et des performances maximales:
Utilisez varchar pour le nom, les titres, les e-mails
Utiliser du texte pour des données volumineuses
Texte séparé dans différents tableaux
Utiliser les requêtes de jointure gauche sur un ID tel qu'un numéro de téléphone
Si vous allez utiliser Blob, appliquez les mêmes conseils que dans Text
Ainsi, les requêtes coûteront des millisecondes sur des tables avec des données> 10 M et une taille jusqu'à 10 Go garantie.
la source