la risposta breve:
select ENGINE, TABLE_NAME,Round( DATA_LENGTH/1024/1024) as data_length , round(INDEX_LENGTH/1024/1024) as index_length, round(DATA_FREE/ 1024/1024) as data_free from information_schema.tables where DATA_FREE > 0;
La risposta "Devi sapere"
prima di tutto devi capire che le tabelle Mysql vengono frammentate quando una riga viene aggiornata, quindi è una situazione normale. Quando viene creata una tabella, diciamo importata usando un dump con dati, tutte le righe vengono archiviate senza frammentazione in molte pagine di dimensioni fisse. Quando si aggiorna una riga di lunghezza variabile, la pagina contenente questa riga viene divisa in due o più pagine per memorizzare le modifiche e queste nuove due (o più) pagine contengono spazi vuoti che riempiono lo spazio inutilizzato.
Ciò non influisce sulle prestazioni, a meno che ovviamente la frammentazione non cresca troppo. Cos'è troppa frammentazione, bene vediamo la query che stai cercando:
select ENGINE, TABLE_NAME,Round( DATA_LENGTH/1024/1024) as data_length , round(INDEX_LENGTH/1024/1024) as index_length, round(DATA_FREE/ 1024/1024) as data_free from information_schema.tables where DATA_FREE > 0;
DATA_LENGTH e INDEX_LENGTH sono lo spazio utilizzato dai dati e dagli indici e DATA_FREE è la quantità totale di byte non utilizzati in tutte le pagine della tabella (frammentazione).
Ecco un esempio di una vera tabella di produzione
| ENGINE | TABLE_NAME | data_length | index_length | data_free |
| InnoDB | comments | 896 | 316 | 5 |
In questo caso abbiamo una tabella che utilizza (896 + 316) = 1212 MB e disponiamo di uno spazio libero di dati di 5 MB. Ciò significa un "rapporto di frammentazione" di:
5/1212 = 0.0041
... Che è un "rapporto di frammentazione" davvero basso.
Ho lavorato con tabelle con un rapporto vicino a 0,2 (che significa il 20% di spazi vuoti) e non ho mai notato un rallentamento delle query, anche se ottimizzo la tabella, le prestazioni sono le stesse. Ma applicare una tabella di ottimizzazione su una tabella da 800 MB richiede molto tempo e blocca la tabella per diversi minuti, il che è impraticabile per la produzione.
Quindi, se consideri ciò che vinci in termini di prestazioni e il tempo sprecato nell'ottimizzare un tavolo, preferisco NON OTTIMIZZARE.
Se ritieni che sia meglio per l'archiviazione, vedi il tuo rapporto e vedi quanto spazio puoi risparmiare quando ottimizzi. Di solito non è troppo, quindi preferisco NON OTTIMIZZARE.
E se ottimizzi, il prossimo aggiornamento creerà spazi vuoti suddividendo una pagina in due o più. Ma è più veloce aggiornare una tabella frammentata rispetto a una non frammentata, perché se la tabella è frammentata un aggiornamento su una riga non necessariamente dividerà una pagina.
Spero che questo ti aiuta.