Dipende.
Se si dispone di una tabella a larghezza fissa (senza VARCHAR
, VARBINARY
, BLOB
o TEXT
), sarà probabilmente fare alcuna differenza.
In una tabella a larghezza variabile, uno NULL
probabilmente occuperà lo spazio di un numero vuoto VARCHAR
.
Se si hanno quasi tutti i valori NULL
e solo pochissimi contengono dati, è possibile creare una tabella separata a cui ci si unisce.
Quindi supponiamo di avere una lista di persone in cui solo alcune di loro hanno la data di nascita.
Così, invece di
CREATE TABLE people (id INT UNSIGNED NOT NULL PRIMARY KEY AUTOINCREMENT, name VARCHAR(60) NOT NULL, birthday DATE)
si potrebbe fare
CREATE TABLE people (id INT UNSIGNED NOT NULL PRIMARY KEY AUTOINCREMENT, name VARCHAR(60) NOT NULL)
CREATE TABLE birthdates (id INT UNSIGNED, birthday DATE NOT NULL)
e interrogare i dati con un LEFT JOIN.
Se ci sono applicazioni che devono accedere alla tabella nel vecchio formato, è possibile definire una vista.
[Possibilmente A Duplicato] (http://stackoverflow.com/questions/5015990/mysql-integer-0-vs-null) – gks
@Thanga grazie per il ref è simile, ma mi interessa sapere di implicazioni sullo spazio su disco e sull'indice. Chiarirò – Noam
oltre alla mia risposta qui sotto, il mio consiglio è che questo suona come un caso di "ottimizzazione prematura". Questo non vale davvero il tuo tempo per preoccuparti. Basta progettare uno schema che abbia senso. Ti garantisco che questo non sarà il tuo collo di bottiglia più grande. –