InnoDB memorizza le tabelle "larghe" in un modo diverso. Invece di avere tutte le colonne insieme in un'unica stringa (più l'overhead, come lunghezze, ecc.), esegue le seguenti operazioni:
- Se il totale di tutte le colonne di una determinata riga supera circa 8 KB, alcuni dati verranno spostati in un'altra area di archiviazione ("off-record").
- Le colonne che vengono spostate fuori record dipendono dalle dimensioni delle colonne, ecc.
- I dettagli dipendono da
ROW_FORMAT
scelto. - "Off-record" è un altro blocco (o blocchi) da 16 KB.
- Più tardi, quando si esegue
SELECT *
(o almeno recuperando le colonne off-record), deve eseguire un altro recupero del disco.
Cosa fare?
- Ripensa ad avere così tante colonne.
- Considera il "partizionamento verticale", in cui hai un'altra/e tabella/e che contiene
TEXT
selezionato colonne. Suggerisci di selezionare gruppi di colonne in base ai modelli di accesso nella tua app. - Per colonne che di solito sono piuttosto lunghe, considera la possibilità di comprimerle nel client e di archiviarle in un
BLOB
invece di unTEXT
. La maggior parte del "testo" si riduce 3:1. I BLOB vengono inviati fuori registro come i Testi, tuttavia, questi BLOB compressi sarebbero più piccoli, quindi è meno probabile che si riversino. - Esegui più elaborazioni in SQL -- per evitare di restituire tutte le righe, o per evitare di restituire il testo completo, ecc. Quando si spala ciecamente molto testo su un client, la rete e il client diventano un fattore significativo nel tempo trascorso, non solo il
SELECT
, stesso.