Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[mysql] spazio occupato su disco

8 views
Skip to first unread message

diesel.cu.mi.it

unread,
Sep 2, 2009, 8:46:10 AM9/2/09
to
Domanda da newbie: se definisco un campo VARCHAR(100) e non ci inserisco
dati, occupa comunque i 100 byte come spazio su disco?

diesel.cu.mi.it

unread,
Sep 2, 2009, 9:35:34 AM9/2/09
to
diesel.cu.mi.it ha scritto:

> Domanda da newbie: se definisco un campo VARCHAR(100) e non ci inserisco
> dati, occupa comunque i 100 byte come spazio su disco?


Mi rispondo da solo.

Ho una tabella di 300058 record.
Il file d:\xampp\mysql\data\miodb\miatabella.MYD ᅵ di 15.650.748 bytes.
Aggiungo un campo varchar di 250 caratteri alla tabella.
Il file d:\xampp\mysql\data\miodb\miatabella.MYD ᅵ di 16.149.448 bytes.
Rimuovo il campo varchar di 200 caratteri dalla tabella.
Il file d:\xampp\mysql\data\miodb\miatabella.MYD ᅵ di 15.650.748 bytes.

Di conseguenza la risposta ᅵ "ni", se non valorizzo il campo, non occupa
spazio su disco. Perᅵ occupa 1,66 caratteri a record.

The man with two watches

unread,
Sep 3, 2009, 3:23:25 PM9/3/09
to
"diesel.cu.mi.it"

> Domanda da newbie: se definisco un campo VARCHAR(100) e non ci
> inserisco dati, occupa comunque i 100 byte come spazio su disco?

Non occupa quei 100, e questa e` la differenza principale
rispetto al CHAR. Tuttavia un po' di spazio viene sempre
occupato da alcune strutture.

Il CHAR viene messo in linea con tutto il record, es.:

valore1, "D'in su la vetta della torre...", valore2

Se la lunghezza e` costante, e` meglio usare il CHAR se le
prestazioni sono importanti. Infatti se tutte le colonne sono
a larghezza prevedibile, sono possibili alcune ottimizzazioni
(es. si sa gia' che ogni record avra' lunghezza uguale a tutti
gli altri, etc).

Normalmente il VARCHAR invece viene implementato come puntatore
a stringa di lunghezza variabile:

valore1, <ptr>, valore2

...e questo causa un po' di frammentazione.
Alla locazione <ptr> troveremo l'indicatore della lunghezza
della stringa, e la stringa vera e propria. Queste strutture
occupano spazio anche se la stringa e` zero, come hai osservato.

L'uso di un puntatore e` praticamente obbligatorio da parte
del dbms per gestire efficientemente il caso di una stringa che
improvvisamente "esploda" di dimensioni.

Tutto questo "a spanne", poi ci sono vari casi particolari etc.


diesel.cu.mi.it

unread,
Sep 4, 2009, 2:43:20 AM9/4/09
to
The man with two watches ha scritto:
Ok. Tutto chiaro.
Grazie per la spiegazione, chiarisce ciᅵ che fumosamente intuivo.
0 new messages