2009-07-20 18 views
54

In che modo MySQL memorizza un campo varchar? Posso presumere che il seguente schema rappresenta formati di archiviazione sensibili:Quali sono le dimensioni varchar ottimali per MySQL?

1,2,4,8,16,32,64,128,255 (max)

Un chiarimento via esempio. Diciamo che ho un campo varchar di 20 caratteri. MySQL quando si crea questo campo, fondamentalmente riserva spazio per 32 byte (non sono sicuro se siano byte o meno), ma consente solo l'immissione di 20?

Immagino di essere preoccupato per l'ottimizzazione dello spazio su disco per un tavolo enorme.

+7

Vorrei precisare che a partire da MySQL 5.0.3 varchar può essere verso l'alto di 65.535 – joshtronic

risposta

46

Per rispondere alla domanda, sul disco MySql utilizza 1 + la dimensione utilizzata nel campo per memorizzare i dati (quindi se la colonna è stata dichiarata varchar (45) e il campo era "FooBar", avrebbe utilizzato 7 byte su disco, a meno che, ovviamente, non si utilizzi un set di caratteri multibyte, dove utilizzerebbe 14 byte). Quindi, comunque dichiari le tue colonne, non farà differenza sul lato archiviazione (hai dichiarato che sei preoccupato dell'ottimizzazione del disco per una tabella enorme). Tuttavia, fa una differenza nelle query, poiché i VARCHAR vengono convertiti in CHAR quando MySql crea una tabella temporanea (ORDINA, ORDINE, ecc.) E più record si possono inserire in una singola pagina, meno memoria e più veloce saranno le scansioni della tabella essere.

+0

hm? quindi, su charset multibyte è ((size) + 2)? – andyk

+3

No, su multibyte è (dimensione * 2) + 1. –

+2

@Kris: Credo che possa anche essere (dimensione * 3) + 1 o pari (dimensione * 4) + 1, no? –

22

MySQL memorizza un campo varchar come record di lunghezza variabile, con prefisso di un byte o di due byte per indicare la dimensione del record.

Avere un modello di dimensioni di memoria non fa alcuna differenza sul modo in cui MySQL funzionerà quando si ha a che fare con la memorizzazione di record di lunghezza variabile. La lunghezza specificata in una dichiarazione varchar (x) determinerà semplicemente la lunghezza massima dei dati che possono essere memorizzati. Fondamentalmente, un varchar (16) non è diverso dal disco rispetto a un varchar (128).

This manual page ha una spiegazione più dettagliata.

Modifica: per quanto riguarda la domanda aggiornata, la risposta è sempre la stessa. Un campo varchar utilizzerà solo tanto spazio su disco quanto i dati memorizzati in esso (più un overhead di uno o due byte). Quindi non importa se hai un varchar (16) o un varchar (128), se memorizzi una stringa di 10 caratteri, utilizzerai solo 10 byte (più 1 o 2) di spazio su disco .

+30

In realtà l'accesso fa una grande differenza, poiché quando MySql crea il set di risultati in memoria lo trasforma in una matrice, quindi se il tuo il campo più grande è di 16 caratteri, ma il campo è definito come 128 caratteri e devi assegnare 112 caratteri in più per ogni riga. Questo spreca molto un ricordo. –

+2

Non solo devi allocare 112 caratteri in più per ogni riga in memoria, ma avrai un sacco di altri errori nella cache L1 quando ogni riga viene ripetuta. Questo è confrontato con un tipo di colonna VARCHAR (16), in cui è possibile spremere molte più righe con questa colonna nella cache ad alta velocità sotto il cofano. –

Problemi correlati