InnoDB stocke les tables "larges" d'une manière différente. Au lieu d'avoir toutes les colonnes ensemble dans une seule chaîne (plus la surcharge, comme les longueurs, etc.), il fait ce qui suit :
- Si le total de toutes les colonnes d'une ligne donnée dépasse environ 8 Ko, une partie des données sera déplacée vers une autre zone de stockage ("off-record").
- Les colonnes déplacées de manière confidentielle dépendent de la taille des colonnes, etc.
- Les détails dépendent du
ROW_FORMAT
choisi. - "Off-record" est un autre bloc (ou blocs) de 16 Ko.
- Plus tard, en faisant
SELECT *
(ou au moins en récupérant la ou les colonnes hors enregistrement), il doit effectuer une autre récupération de disque.
Que faire ?
- Repensez au nombre de colonnes.
- Envisagez un "partitionnement vertical", dans lequel vous avez une ou plusieurs autres tables contenant le
TEXT
sélectionné Colonnes. Suggérez de choisir des groupes de colonnes en fonction des modèles d'accès dans votre application. - Pour les colonnes qui sont généralement assez longues, envisagez de les compresser dans le client et de les stocker dans un
BLOB
au lieu d'unTEXT
. La plupart des "textes" rétrécissent de 3:1. Les blobs sont envoyés de manière non enregistrée de la même manière que les textes, cependant, ces blobs compressés seraient plus petits, donc moins susceptibles de se répandre. - Effectuez davantage de traitement en SQL :pour éviter de renvoyer toutes les lignes, ou pour éviter de renvoyer le texte intégral, etc. Lorsque vous envoyez aveuglément beaucoup de texte à un client, le réseau et le client deviennent un facteur important dans le temps écoulé, pas seulement le
SELECT
, lui-même.