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

Come ottenere la dimensione di una tabella in MySQL

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 (in bytes ).
  • INDEX_LENGTH è la lunghezza (o dimensione) del file di indice per la tabella (anche in bytes ).

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.