Mysql
 sql >> Database >  >> RDS >> Mysql

Numero elevato di colonne, Seleziona tutto richiede per sempre

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 un TEXT . 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.