Après la version 5.0.3 (qui autorisait VARCHAR à 65 535 octets et arrêtait de tronquer les espaces de fin), existe-t-il une différence majeure entre ces deux types de données?
Je lisais la liste des différences et les deux seules à noter sont:
Pour les index sur les colonnes BLOB et TEXT, vous devez spécifier une longueur de préfixe d'index. Pour CHAR et VARCHAR, une longueur de préfixe est facultative. Voir Section 7.5.1, «Index des colonnes».
et
Les colonnes BLOB et TEXT ne peuvent pas avoir de valeurs DEFAULT.
Donc, en raison de ces deux limitations du type de données TEXT, pourquoi l'utiliseriez-vous sur varchar (65535)? Y a-t-il des ramifications de performance de l'une sur l'autre?
mysql
database-design
datatypes
Derek Downey
la source
la source
Réponses:
divisé lié à des informations qui expliquent le problème de base (il y a des différences de performances), mais ce n'est pas assez simple pour dire que l'un est toujours meilleur que l'autre. (sinon, il n'y aurait aucune raison d'avoir les deux.) De plus, dans MyISM, la taille maximale de 64 Ko pour VARCHAR n'est pas par champ - c'est par enregistrement.
Fondamentalement, il existe 4 façons de stocker des chaînes dans des enregistrements de base de données:
MyISM utilise quelque chose de similaire à # 3 pour VARCHAR, et une approche hybride pour TEXT où il stocke le début de la chaîne dans l'enregistrement, puis le reste de la chaîne ailleurs. InnoDB est similaire pour VARCHAR, mais stocke le champ TEXT complet en dehors de l'enregistrement.
Avec 1 & 4, le contenu de l'enregistrement est toujours de la même longueur, il est donc plus facile de sauter si vous n'avez pas besoin de la chaîne, mais que vous avez besoin de la suite. Les # 2 et # 3 ne sont pas trop mauvais pour les cordes courtes ... # 2 doit continuer à chercher le marqueur, tandis que # 3 peut aller de l'avant ... à mesure que les cordes s'allongent, # 2 s'aggrave pour cette utilisation particulière Cas.
Si vous avez réellement besoin de lire la chaîne, # 4 est plus lent, car vous devez lire l'enregistrement, puis lire la chaîne qui pourrait être stockée ailleurs sur le disque, selon la façon dont cette base de données la gère. # 1 est toujours assez simple, et encore une fois vous rencontrez des problèmes similaires où pour # 2 s'aggrave plus la chaîne est longue, tandis que # 3 est un peu pire que # 2 pour les très petites chaînes, mais mieux car elle s'allonge.
Ensuite, il y a des exigences de stockage ... # 1 est toujours une longueur fixe, donc il peut avoir un gonflement si la plupart des chaînes ne sont pas la longueur maximale. # 2 a 1 octet supplémentaire; # 3 a généralement 2 octets supplémentaires si la longueur maximale = 255, 4 octets supplémentaires si un maximum de 64k. # 4 a la longueur du pointeur, plus les règles pour # 3 généralement.
Pour les implémentations spécifiques dans MySQL 5.1, les documents pour MyISM indiquent :
Alors que pour InnoDB :
...
comme avec tant d'autres choses lorsque vous traitez avec des bases de données, si vous n'êtes pas sûr de ce qui convient le mieux à vos besoins, essayez de le comparer avec des données et une utilisation similaires, et voyez comment elles se comportent.
la source
LONGTEXT
et enLONGBLOB
sont un exemple. Les chaînes de style C ne sont utilisées nulle part par MySQL (à ma connaissance). InnoDB utilise une approche "hybride", mais elle est plus complexe, en fonction de la taille de la ligne, du format de ligne, etc. . InnoDB en a 4ROW_FORMATs
; le texte n'en traite que 1 ou 2.Lorsqu'un SELECT doit créer une table temporaire (comme pour trier les résultats), il crée soit une table MEMORY, soit une table MyISAM. MEMORY est plus efficace. Il y a des restrictions sur la MÉMOIRE - l'une consiste à interdire TEXT et BLOB. Par conséquent, un SELECT peut s'exécuter plus lentement avec TEXT que VARCHAR.
la source