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

NULL in MySQL (prestazioni e archiviazione)

Dipende dal motore di archiviazione che utilizzi.

Nel formato MyISAM, ogni intestazione di riga contiene un campo di bit con un bit per ciascuna colonna per codificare lo stato NULL. Una colonna NULL occupa comunque spazio, quindi NULL non riduce lo spazio di archiviazione. Vedi https://dev.mysql.com/doc/internals/ it/myisam-introduzione.html

In InnoDB, ogni colonna ha un "offset inizio campo" nell'intestazione della riga, che è uno o due byte per colonna. Il bit alto in quell'offset di inizio campo è attivo se la colonna è NULL. In tal caso, non è necessario archiviare la colonna. Quindi, se hai molti NULL, lo spazio di archiviazione dovrebbe essere notevolmente ridotto. Vedi https://dev.mysql.com/doc/internals/en/innodb-field-contents.html

MODIFICA:

I bit NULL fanno parte delle intestazioni di riga, non scegli di aggiungerli.

L'unico modo in cui posso immaginare che i NULL migliorino le prestazioni è che in InnoDB, una pagina di dati può contenere più righe se le righe contengono NULL. Quindi i tuoi buffer InnoDB potrebbero essere più efficaci.

Ma sarei molto sorpreso se ciò offrisse un significativo vantaggio in termini di prestazioni nella pratica. Preoccuparsi dell'effetto che i NULL hanno sulle prestazioni rientra nel regno della micro-ottimizzazione. Dovresti concentrare la tua attenzione altrove, in aree che danno un maggiore rapporto qualità-prezzo. Ad esempio, aggiungendo indici scelti con cura o aumentando l'allocazione della cache del database.