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

Perché data_free di MySQL è più grande di dati e indici combinati?

Presumo che tu stia utilizzando InnoDB, perché è il motore di archiviazione predefinito in MySQL 5.5.

I tablespace di InnoDB crescono quando si inseriscono i dati, ma i file non si riducono quando si eliminano i dati. Quindi, ad esempio, se inserisci 1 milione di righe e poi le elimini, il file avrà molto spazio allocato fisicamente, ma non più utilizzato. InnoDB riutilizzerà quello spazio se possibile prima di far crescere nuovamente il file tablespace.

Inoltre, anche se non elimini, potrebbe esserci dello spazio "sprecato" perché quando le dimensioni dei file tablespace vengono aumentate, vengono espanse di una grossa fetta di pagine, determinata dall'opzione di configurazione innodb_autoextend_increment in megabyte. Fino a quando quelle pagine non vengono riempite di dati, sono spazio libero.

Data_free riportato da InnoDB è la quantità di spazio "sprecato" nelle pagine vuote nel file tablespace centrale. Non ha nulla a che fare con i valori NULL, ha a che fare con le pagine di dati che non contengono righe.

Inoltre, in MySQL 5.5, l'impostazione predefinita è che tutte le tabelle condividano un tablespace centrale chiamato ibdata . Data_Free per tutte le tabelle in questo tablespace riporterà la stessa cifra, che è la quantità di spazio nelle pagine libere nell'intero tablespace, non solo per una tabella.

Puoi anche allocare uno spazio tabella separato per tabella (innodb_file_per_table=1 ), e per le tabelle in tablespace separati, vedrai un valore diverso per tabella per data_free.

Data_free segnala solo lo spazio lasciato da extent completamente vuoti (un'estensione è un blocco di pagine pari a 1 MB). Noterai che data_free è sempre un multiplo di 1 MB. I blocchi più piccoli di pagine libere non vengono conteggiati in data_free, né le pagine parzialmente riempite. Quindi lo spazio "sprecato" è probabilmente molto più grande, ma non abbiamo modo di saperlo.