2010-05-21 4 views
4

J'ai plusieurs champs TEXT et/ou MEDIUMTEXT dans chacune de nos 1000 tables MySQL. Je sais maintenant que les champs TEXT sont écrits sur le disque plutôt qu'en mémoire lorsqu'ils sont interrogés. Est-ce vrai aussi, même si ce champ n'est pas appelé dans la requête? Par exemple, si j'ai une table (tbExam) avec 2 champs (id int (11) et le texte du commentaire) et que j'exécute SELECT id FROM tbExam, est-ce que MySQL doit encore écrire sur le disque avant de retourner les résultats? en mémoire? J'essaye de comprendre si j'ai besoin de reconfigurer nos tables actuelles de DB pour passer à varchar (xxxx) ou garder les champs de texte et reconfigurer les requêtes.Performance du champ MySQL TEXT

Répondre

17

Je sais maintenant que les champs de texte sont écrits sur le disque plutôt que dans la mémoire lors d'une interrogation

TEXT champs sont écrits sur le disque uniquement lorsque la requête nécessite une table temporaire pour stocker les résultats intermédiaires de tri multiple ou opérations globales. Cela se produit, par exemple, lorsque vous mélangez DISTINCT, ORDER BY et GROUP BY sur différentes colonnes dans une même requête.

Si votre colonne TEXT ne fait pas partie de cette table temporaire, MySQL va d'abord essayer de le créer en utilisant le moteur MEMORY (qui ne prend pas en charge TEXT).

MyISAM Le moteur pour une table temporaire ne sera choisi que si la taille de cette table dépasse @@tmp_table_size ou si certaines colonnes MEMORY ne prennent pas en charge.

Pour une requête comme ceci:

SELECT id 
FROM tbExam 

, une table temporaire ne sera pas nécessaire du tout.

Il existe une légère différence dans la façon plugin moteur de stockage InnoDB (qui est responsable de l'interaction entre InnoDB et MySQL) se comporte par rapport à TEXT et VARCHAR champs: un champ VARCHAR est transmis à la mémoire tampon d'enregistrements en valeur tandis qu'un champ TEXT est passé par référence.

En interne, InnoDB magasins TEXT et VARCHAR champs d'une même manière: en-ligne si toute la colonne s'insère dans la moitié d'une page, hors ligne, sinon. La différence ci-dessus ne concerne que les problèmes d'interaction InnoDB/MySQL.

Si vous ne demandez pas ces champs, il n'y a aucune différence.

+1

Merci pour la réponse détaillée. Je vais vous donner un point dès que j'aurai 15 points de réputation et que je serai autorisé à le faire. – Jonathon