web-dev-qa-db-fra.com

Quel type de données de colonne dois-je utiliser pour stocker de grandes quantités de texte ou html

J'ai une colonne dans une table qui était varchar (255) au début et en raison de quelques modifications de conception, il s'agit maintenant de varchar (1536) = 1024 + 512. Je ne rechercherai ni n'indexerai ce champ, est-ce que cela a du sens stocker cette valeur dans un type de données différent d'un varchar si vous souhaitez optimiser cela pour les performances?

44
user339108

Oui, ce sera mieux si vous pouvez stocker les valeurs dans le type de données "TEXT". Pour plus de détails, veuillez lire cet article .

En ce qui concerne la connaissance des exigences de stockage, vous pouvez lire celui-ci .

J'espère que ça aide.

29
Knowledge Craving

Vous devriez utiliser TEXT comme les autres l'ont dit, mais il y a des conseils importants à chaque fois que vous utilisez TEXT ou BLOB: les découpler de votre table de base car ils ralentissent vraiment l'accès à la table. Imaginez la structure suivante:

CREATE TABLE article (
    id INT(10) UNSIGNED,
    title VARCHAR(40),
    author_id INT(10) UNSIGNED,
    created DATETIME,
    modified DATETIME
);

CREATE TABLE article_body (
    id INT(10) UNSIGNED,
    body TEXT
);

Chaque fois que vous listez des articles, vous pouvez utiliser la table article (5 derniers articles de l'auteur 33):

SELECT id, title FROM article WHERE author_id=33 ORDER BY created DESC LIMIT 5

Et quand quelqu'un ouvre vraiment l'article, vous pouvez utiliser quelque chose comme:

SELECT a.title, ab.body
FROM article AS a
   LEFT JOIN article_body AS ab ON ab.id = a.id
WHERE a.id=82
89
vbence

Vous devez utiliser un fichier, pas une base de données pour le stocker. Surtout pas MySQL. J'ai rédigé une fois une explication expliquant ce qui se passe si, par exemple, vous téléchargez des images à partir d'un BLOB de base de données, voir http://mysqldump.azundris.com/archives/36-Serving-Images-From-A-Database.html . À l'aide de fichiers, vous pouvez utiliser le chemin rapide du serveur Web à l'aide de l'appel système sendfile (2), et il est beaucoup plus rapide de l'utiliser.

MySQL n'a pas non plus d'API BLOB. Cela signifie qu'il est impossible de télécharger ou de télécharger des objets plus grands que max_allowed_packet, et il est difficile de contourner cela en utilisant SUBSTRING (), car cela fera des copies inutiles des chaînes dans la mémoire du serveur.

Si vous DEVEZ absolument stocker des données BLOB ou TEXT sur le serveur, vous avez le choix entre TINYTEXT, TEXT, MEDIUMTEXT et LARGETEXT qui sont limités à 255, 65535, 16 Mo et 4 Go de données sur le serveur, en plus contraint par max_allowed_packet.

Les informations BLOB ou TEXT volumineuses anéantiront complètement la densité des données dans votre table. Il est utile de créer une relation artificielle 1: 1 ou 1: 0 avec une table BLOB, puis de stocker les blobs dans cette table supplémentaire.

Lorsque MySQL affiche un plan de requête qui utilise "temporaire", cela signifie que le serveur doit matérialiser la table de l'ensemble de résultats dans le serveur avant de livrer le résultat. Cela se fait en utilisant des tables MEMORY, si possible. Tout type TEXT ou BLOB ne peut pas être représenté dans les tables MEMORY, par conséquent, la table temporaire frappe alors le disque en tant que table MyISAM à la place.

Vous devez rechercher de tels plans de requête et les convertir en quelque chose qui charge les valeurs d'ID des valeurs BLOB/TEXT à la place. Dans une deuxième requête, vous devez ensuite SELECT id, le texte FROM table de texte WHERE id dans (...) pour obtenir les valeurs TEXT/BLOB. Cela fera en sorte que la requête avec 'utilisation temporaire' n'utilise pas les types TEXT ou BLOB, et vous pouvez alors obtenir les champs TEXT avec une requête triviale qui s'exécute sans 'utiliser temporaire'.

Vous pouvez en savoir plus sur les fonctions internes du stockage MySQL TEXT et BLOB en lisant http://www.mysqlperformanceblog.com/2010/02/09/blob-storage-in-innodb/

10
Isotopp

J'utiliserais text pour les colonnes de longueur variable.

2
Femaref