Domanda

Che cosa fa esattamente null la prestazione e lo spazio di archiviazione (spazio) in MySQL?

Ad esempio:

TINYINT: 1 byte TINYINT w / NULL 1 byte + in qualche modo memorizza NULL?

È stato utile?

Soluzione

Dipende dal motore di archiviazione utilizzato.

Nel formato MyISAM, ogni intestazione di riga contiene un campo bit con un bit per ogni colonna per codificare lo stato NULL. Una colonna NULL occupa ancora spazio, quindi i NULL non riducono l'archiviazione. Vedi https://dev.mysql.com/doc/internals/en/ MyISAM-introduction.html

In InnoDB, ogni colonna ha un offset di inizio campo " nell'intestazione di riga, che è uno o due byte per colonna. Il bit alto in quell'offset iniziale è attivo se la colonna è NULL. In tal caso, la colonna non deve essere affatto memorizzata. Quindi, se hai molti NULL, il tuo spazio di archiviazione dovrebbe essere significativamente ridotto. Vedi https://dev.mysql.com/doc/internals/ it / innodb-campo-contents.html

Modifica

I bit NULL fanno parte delle intestazioni di riga, non si sceglie 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 questo offre un vantaggio prestazionale significativo nella pratica. Preoccuparsi dell'effetto che i NULL hanno sulle prestazioni è nel regno della micro-ottimizzazione. Dovresti focalizzare la tua attenzione altrove, in aree che danno maggiore risonanza. Ad esempio aggiungendo indici ben scelti o aumentando l'allocazione della cache del database.

Altri suggerimenti

La risposta di Bill è buona, ma un po 'datata. L'uso di uno o due byte per la memorizzazione di NULL si applica solo al formato di riga RIDONDANTE di InnoDB. Poiché MySQL 5.0.3 InnoDB utilizza il formato di riga COMPATTO che utilizza solo un bit per memorizzare un NULL (ovviamente un byte è il minimo), quindi:

Spazio richiesto per NULL = SOFFITTO (N / 8) byte dove N è il numero di colonne NULL in una riga.

  • 0 NULLS = 0 byte
  • 1 - 8 NULLS = 1 byte
  • 9-16 NULLS = 2 byte
  • 17-24 NULLS = 3 byte
  • ecc ...

Secondo il sito ufficiale MySQL su COMPACT vs REDUNDANT:

  

Il formato compatto delle righe riduce lo spazio di archiviazione delle righe di circa il 20% a scapito dell'aumento dell'utilizzo della CPU per alcune operazioni. Se il carico di lavoro è tipico, limitato dalle percentuali di hit della cache e dalla velocità del disco, è probabile che il formato compatto sia più veloce.

Vantaggio dell'uso di NULLS su stringhe vuote o zeri:

  • 1 NULL richiede 1 byte
  • 1 stringa vuota richiede 1 byte (presupponendo VARCHAR)
  • 1 zero richiede 4 byte (presupponendo INT)

Inizi a vedere i risparmi qui:

  • 8 NULL richiedono 1 byte
  • 8 stringhe vuote richiedono 8 byte
  • 8 zeri richiedono 32 byte

D'altra parte, suggerisco di usare i NULL su stringhe o zeri vuoti, perché sono più organizzati, portatili e richiedono meno spazio. Per migliorare le prestazioni e risparmiare spazio, concentrati sull'utilizzo dei tipi di dati, degli indici e delle query corretti anziché su strani trucchi.

Altre informazioni su: https://dev.mysql.com/doc/refman /5.7/en/innodb-physical-record.html

Sono d'accordo con Bill Karwin, anche se aggiungerei questi suggerimenti per MySQL . Il numero 11 si rivolge specificamente a questo:

  

Prima di tutto, chiediti se c'è qualche differenza tra avere un valore stringa vuoto rispetto a un valore NULL (per i campi INT: 0 vs. NULL). Se non vi è alcun motivo per avere entrambi, non è necessario un campo NULL. (Sapevi che Oracle considera NULL e stringa vuota uguali?)

     

Le colonne NULL richiedono spazio aggiuntivo e possono aggiungere complessità alle dichiarazioni di confronto. Evitali quando puoi. Tuttavia, capisco che alcune persone potrebbero avere ragioni molto specifiche per avere valori NULL, il che non è sempre una cosa negativa.

D'altra parte, utilizzo ancora null su tabelle che non hanno tonnellate di righe, principalmente perché mi piace la logica di dire NOT NULL.

Aggiorna Rivisitando questo in seguito, aggiungerei che personalmente non mi piace usare 0 invece di NULL nel database e non lo consiglio. Questo può facilmente portare a molti falsi positivi nella tua applicazione se non stai attento.

dev.mysql.com/doc/refman/ 5.0 / it / is-null-optimisation.html

MySQL può eseguire la stessa ottimizzazione su col_name IS NULL che può usare per col_name = constant_value. Ad esempio, MySQL può utilizzare indici e intervalli per cercare NULL con IS NULL

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top