Come puoi determinare quanto spazio su disco occupa una determinata tabella MySQL?


145

Esiste un modo rapido per determinare quanto spazio su disco occupa una determinata tabella MySQL? La tabella può essere MyISAM o Innodb.


In PHPMyAdmin puoi vedere l'utilizzo dello spazio semplicemente facendo clic sulla tabella.
AR.

Le risposte a questa domanda mi hanno aiutato a ottenere la mia soluzione. Una ricerca approfondita di uno strumento che potrebbe aiutarmi senza eseguire la stessa query ogni volta per ottenere i dati mi ha fatto passare attraverso MONyog , MySQL Enterprise Monitor , Percona toolkit . Tutti forniscono dettagli sulle informazioni del disco, ma alla fine hanno optato per MONyog per una migliore grafica e una semplice interfaccia grafica.
Mathew,

Risposte:


285

Per una tabella mydb.mytableesegui questo per:

BYTES

SELECT (data_length+index_length) tablesize
FROM information_schema.tables
WHERE table_schema='mydb' and table_name='mytable';

kilobyte

SELECT (data_length+index_length)/power(1024,1) tablesize_kb
FROM information_schema.tables
WHERE table_schema='mydb' and table_name='mytable';

MEGABYTES

SELECT (data_length+index_length)/power(1024,2) tablesize_mb
FROM information_schema.tables
WHERE table_schema='mydb' and table_name='mytable';

GIGABYTES

SELECT (data_length+index_length)/power(1024,3) tablesize_gb
FROM information_schema.tables
WHERE table_schema='mydb' and table_name='mytable';

GENERICO

Ecco una query generica in cui la visualizzazione massima dell'unità è TB (TeraBytes)

SELECT 
    CONCAT(FORMAT(DAT/POWER(1024,pw1),2),' ',SUBSTR(units,pw1*2+1,2)) DATSIZE,
    CONCAT(FORMAT(NDX/POWER(1024,pw2),2),' ',SUBSTR(units,pw2*2+1,2)) NDXSIZE,
    CONCAT(FORMAT(TBL/POWER(1024,pw3),2),' ',SUBSTR(units,pw3*2+1,2)) TBLSIZE
FROM
(
    SELECT DAT,NDX,TBL,IF(px>4,4,px) pw1,IF(py>4,4,py) pw2,IF(pz>4,4,pz) pw3
    FROM 
    (
        SELECT data_length DAT,index_length NDX,data_length+index_length TBL,
        FLOOR(LOG(IF(data_length=0,1,data_length))/LOG(1024)) px,
        FLOOR(LOG(IF(index_length=0,1,index_length))/LOG(1024)) py,
        FLOOR(LOG(IF(data_length+index_length=0,1,data_length+index_length))/LOG(1024)) pz
        FROM information_schema.tables
        WHERE table_schema='mydb'
        AND table_name='mytable'
    ) AA
) A,(SELECT 'B KBMBGBTB' units) B;

Provaci !!!


6
SELECT (data_length+index_length)/power(1024,2) tablesize_mb, table_name FROM information_schema.tables WHERE table_schema='mydb' order by tablesize_mb;per ottenere un elenco di tutte le tabelle di mydbcon nome e dimensione, ordinate per dimensione.
kqw,

1
Aggiungi "DESC" alla clausola ORDER BY per vedere le tabelle che consumano prima più spazio su disco. ;)
mvsagar il

Per essere precisi, potresti voler chiamare le unità ki bi byte (KiB), me bi byte (MiB) e gi bi byte (GiB) quando si usano i prefissi binari (moltiplicazione con la potenza di 2). Oppure, potresti voler usare i prefissi decimali (moltiplicazione con la potenza di 1000) e quindi chiamare le unità ki lo byte (KB), me ga byte (MB) e gi ga byte (GB). Vedi di più: en.wikipedia.org/wiki/Binary_prefix
Márton Tamás

Qualcuno sa come fare lo stesso in MSSQL?
Ivan Yurchenko,

@RolandoMySQLDBA, la prego di suggerire su questo stackoverflow.com/questions/47976837/...
davidb

15

Bit veloce di SQL per ottenere le prime 20 tabelle più grandi in MB.

SELECT table_schema, table_name,
  ROUND((data_length+index_length)/POWER(1024,2),2) AS tablesize_mb
FROM information_schema.tables
ORDER BY tablesize_mb DESC LIMIT 20;

Spero che sia utile a qualcuno!



2

In Linux con mysql installato di default:

[you@yourbox]$ ls -lha /var/lib/mysql/<databasename>

basato sulla posizione mysql db di NIXCRAFT


La domanda è: come misurare lo spazio occupato da una determinata tabella .
Flimm,

@ShariqueAbdullah questo funzionerà se stai usando innodb_file_per_table, il che non è predefinito, ma penso che sia molto comune e / o raccomandato (qualcuno può facilmente dimostrarmi sbagliato su questo, solo la mia impressione).
Seaux,

@Seaux, può essere, ma non l'ho trovato in uso in nessuna configurazione di server consigliata che ho passato. Quindi potresti avere ragione, ma poiché non è l'impostazione predefinita, potrebbe non trovarlo. Inoltre, penso che le funzioni di innodb siano piuttosto diverse rispetto a MyISAM. Quindi, anche se hai le dimensioni del file, potrebbe non essere preciso come nel caso di MyISAM. Ma hai ragione, potrebbe essere una soluzione. Personalmente preferisco usare i comandi MySQL per ottenere queste informazioni piuttosto che misurare le dimensioni dei file.
Sharique Abdullah,

2

Sulla base della risposta di RolandMySQLDBA penso che possiamo usare quanto sopra per ottenere le dimensioni di ogni schema in una tabella:

SELECT table_schema, SUM((data_length+index_length)/power(1024,1)) tablesize_kb 
    FROM information_schema.tables GROUP BY table_schema;

Mi è davvero piaciuto!


0

Potresti forse guardare la dimensione dei file ...

Ogni tabella è memorizzata in un paio di file separati all'interno di una cartella che prende il nome da qualunque cosa tu abbia chiamato il tuo database. Queste cartelle sono archiviate nella directory dei dati mysql.

Da lì puoi fare un 'du -sh. *' Per ottenere le dimensioni della tabella sul disco.


Funziona solo con i database MyISAM. L'OP ha richiesto una soluzione che funzioni anche con InnoDB.
Bgs

0

Tratto da Come controllo la quantità di spazio su disco utilizzata dal mio database?

Puoi controllare le dimensioni della tabella MySQL sia guardando phpMyAdminnel pannello di controllo facendo clic sul nome del database nel frame sinistro che leggendo le dimensioni delle tabelle nel frame destro.

La query seguente aiuterà anche a ottenere le stesse informazioni bytes

select SUM(data_length) + SUM(index_length) as total_size 
from information_schema.tables 
where table_schema = 'db_name' 
and table_name='table_name';

Ciò presuppone che phpMyAdmin sia installato
thebigjc il

-1

Vorrei solo usare lo strumento ' mysqldiskusage ' come segue

$ mysqldiskusage --server=user:password@localhost mydbname
# Source on localhost: ... connected.

# Database totals:
+------------+----------------+
| db_name    |         total  |
+------------+----------------+
| mydbaname  | 5,403,033,600  |
+------------+----------------+

Total database disk usage = 5,403,033,600 bytes or 5.03 GB

L'OP ha richiesto lo spazio su disco di una particolare tabella MySQL, non l'intero database
machineaddict
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.