Come la maggior parte dei database relazionali, MySQL fornisce utili metadati sul database stesso. Mentre la maggior parte degli altri database fa riferimento a queste informazioni come a un catalog
, la documentazione ufficiale di MySQL fa riferimento a INFORMATION_SCHEMA
metadati come tables
.
Indipendentemente dal nome, ciò che conta sono le informazioni fornite da questi INFORMATION_SCHEMA
tavoli. Tutto da views
e user_privilieges
a columns
e tables
può essere trovato in INFORMATION_SCHEMA
. Per i nostri scopi siamo particolarmente interessati alle tables
metadati, che possiamo interrogare per estrarre effettivamente la dimensione di varie tabelle nel sistema.
Elenca le dimensioni della tabella da un singolo database
Come si può vedere nella documentazione ufficiale, il INFORMATION_SCHEMA.TABLES
table contiene circa 20 colonne, ma allo scopo di determinare la quantità di spazio su disco utilizzato dalle tabelle, ci concentreremo in particolare su due colonne:DATA_LENGTH
e INDEX_LENGTH
.
DATA_LENGTH
è la lunghezza (o dimensione) di tutti i dati nella tabella (inbytes
).INDEX_LENGTH
è la lunghezza (o dimensione) del file di indice per la tabella (anche inbytes
).
Grazie a queste informazioni, possiamo eseguire una query che elencherà tutte le tabelle in un database specifico insieme allo spazio su disco (dimensione) di ciascuna. Possiamo anche diventare un po' più elaborati e convertire i valori di dimensione normale da bytes
in qualcosa di più utile e comprensibile per la maggior parte delle persone come megabytes
.
SELECT
TABLE_NAME AS `Table`,
ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024) AS `Size (MB)`
FROM
information_schema.TABLES
WHERE
TABLE_SCHEMA = "bookstore"
ORDER BY
(DATA_LENGTH + INDEX_LENGTH)
DESC;
In questo esempio usando la bookstore
database, stiamo combinando il DATA_LENGTH
e INDEX_LENGTH
come bytes
, quindi dividendolo per 1024
due volte da convertire in kilobytes
e poi megabytes
. Il nostro set di risultati sarà simile a questo:
+----------------------------------+-----------+
| Table | Size (MB) |
+----------------------------------+-----------+
| book | 267 |
| author | 39 |
| post | 27 |
| cache | 24 |
...
Se non ti interessano tutte le tabelle nel database e desideri solo la dimensione di una tabella particolare, puoi semplicemente aggiungere AND TABLE_NAME = "your_table_name"
al WHERE
clausola. Qui vogliamo solo informazioni sul book
tabella:
SELECT
TABLE_NAME AS `Table`,
ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024) AS `Size (MB)`
FROM
information_schema.TABLES
WHERE
TABLE_SCHEMA = "bookstore"
AND
TABLE_NAME = "book"
ORDER BY
(DATA_LENGTH + INDEX_LENGTH)
DESC;
I risultati, come previsto, ora sono:
+-------+-----------+
| Table | Size (MB) |
+-------+-----------+
| book | 267 |
+-------+-----------+
1 row in set (0.00 sec)
Elenca tutte le dimensioni delle tabelle da TUTTI i database
Se riscontri un problema in cui le dimensioni del tuo database stanno crescendo ma non sai quale tabella è il colpevole, potrebbe essere utile eseguire una query per la dimensione di tutti tabelle all'interno di tutti database nell'intero sistema. Questo può essere ottenuto facilmente con la seguente query:
SELECT
TABLE_SCHEMA AS `Database`,
TABLE_NAME AS `Table`,
ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024) AS `Size (MB)`
FROM
information_schema.TABLES
ORDER BY
(DATA_LENGTH + INDEX_LENGTH)
DESC;
Ciò restituirà non solo la dimensione della tabella, ma anche il nome della tabella e il database padre a cui è associato.