Come ottenere le dimensioni delle tabelle di un database MySQL?


900

Posso eseguire questa query per ottenere le dimensioni di tutte le tabelle in un database MySQL:

show table status from myDatabaseName;

Vorrei un aiuto per comprendere i risultati. Sto cercando tavoli con le dimensioni più grandi.

Quale colonna dovrei guardare?


8
Cosa intendi per dimensione? Numero di righe? Byte presi su disco?
Mark Byers,

@Mark voglio dimensioni su disco è questo metodo giusto? # du -sh /mnt/mysql_data/openx/f_scraper_banner_details.MYI 79G /mnt/mysql_data/openx/f_scraper_banner_details.MYI
Ashish Karpe

3
In relazione, se è di interesse, ho scritto una descrizione di tutte le tabelle in questa risposta .
Estratto l'

Risposte:


1958

È possibile utilizzare questa query per mostrare le dimensioni di una tabella (sebbene sia necessario sostituire prima le variabili):

SELECT 
    table_name AS `Table`, 
    round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB` 
FROM information_schema.TABLES 
WHERE table_schema = "$DB_NAME"
    AND table_name = "$TABLE_NAME";

o questa query per elencare la dimensione di ogni tabella in ogni database, prima la più grande:

SELECT 
     table_schema as `Database`, 
     table_name AS `Table`, 
     round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB` 
FROM information_schema.TABLES 
ORDER BY (data_length + index_length) DESC;

3
Grazie, funziona bene, anche se non sono sicuro che prenda in considerazione Blobs.
David,

5
Nota, puoi anche usare "IN" per specificare più tabelle, ad esAND table_name IN ('table_1', 'table_2', 'table_3');
David Thomas,

6
AFAICT, questo conterà correttamente solo le lunghezze dei campi di dimensioni statiche. Come conteggi VARCHARe BLOBscrivi?
10

3
@kasimir Ad un certo punto il mondo è diventato confuso e alcune organizzazioni standard e produttori di hardware hanno deciso che era meglio definire un kilobyte sul sistema decimale. Lo standard IEC ora chiama il kilobyte di base 2 (1024 byte) un kibibyte (KiB). Ad ogni modo, MySQL non lo sa, quindi se vuoi
chilobyte

9
Funzionerà con il motore di archiviazione InnoDB? Secondo il documento mysql qui - dev.mysql.com/doc/refman/5.7/en/show-table-status.html , il campo data_length per quel motore contiene le dimensioni dell'indice cluster. Ciò non rappresenterà correttamente la dimensione dei dati. Sara?
euphoria83,

96
SELECT TABLE_NAME AS "Table Name", 
table_rows AS "Quant of Rows", ROUND( (
data_length + index_length
) /1024, 2 ) AS "Total Size Kb"
FROM information_schema.TABLES
WHERE information_schema.TABLES.table_schema = 'YOUR SCHEMA NAME/DATABASE NAME HERE'
LIMIT 0 , 30

Puoi ottenere il nome dello schema da " information_schema " -> tabella SCHEMATA -> colonna " SCHEMA_NAME "


Ulteriori È possibile ottenere le dimensioni dei database mysql come segue.

SELECT table_schema "DB Name", 
Round(Sum(data_length + index_length) / 1024 / 1024, 1) "DB Size in MB" 
FROM   information_schema.tables 
GROUP  BY table_schema; 

Risultato

DB Name              |      DB Size in MB

mydatabase_wrdp             39.1
information_schema          0.0

Puoi ottenere ulteriori dettagli qui.


41
SELECT 
    table_name AS "Table",  
    round(((data_length + index_length) / 1024 / 1024), 2) as size   
FROM information_schema.TABLES  
WHERE table_schema = "YOUR_DATABASE_NAME"  
ORDER BY size DESC; 

Questo ordina le dimensioni (Dimensione DB in MB).


31

Se si desidera che una query utilizzi il database attualmente selezionato. copia semplicemente incolla questa query. (Nessuna modifica richiesta)

SELECT table_name ,
  round(((data_length + index_length) / 1024 / 1024), 2) as SIZE_MB
FROM information_schema.TABLES
WHERE table_schema = DATABASE() ORDER BY SIZE_MB DESC;

5
O ancora più breve (senza subquery): SELEZIONA table_name, round (((data_length + index_length) / 1024/1024), 2) SIZE_MBFROM information_schema.TABLES DOVE table_schema = DATABASE () ORDER BY (data_length + index_length) ASC;
Onkeltem,

15

C'è un modo semplice per ottenere molte informazioni usando Workbench:

  • Fare clic con il tasto destro del mouse sul nome dello schema e fare clic su "Ispettore schema".

  • Nella finestra risultante hai un numero di schede. La prima scheda "Informazioni" mostra una stima approssimativa della dimensione del database in MB.

  • La seconda scheda, "Tabelle", mostra la lunghezza dei dati e altri dettagli per ciascuna tabella.


Non avevo la scheda "info" sul mio client Mac v 6.0.9
Neil

Grande!!! In MySQL Workbench c'è anche un "Table Inspector" per ogni tabella. Non propriamente veloce ma molto utile!
T30

11
  • Dimensioni di tutte le tabelle:

    Supponiamo che il tuo database o TABLE_SCHEMAnome sia "news_alert". Quindi questa query mostrerà la dimensione di tutte le tabelle nel database.

    SELECT
      TABLE_NAME AS `Table`,
      ROUND(((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024),2) AS `Size (MB)`
    FROM
      information_schema.TABLES
    WHERE
      TABLE_SCHEMA = "news_alert"
    ORDER BY
      (DATA_LENGTH + INDEX_LENGTH)
    DESC;

    Produzione:

        +---------+-----------+
        | Table   | Size (MB) |
        +---------+-----------+
        | news    |      0.08 |
        | keyword |      0.02 |
        +---------+-----------+
        2 rows in set (0.00 sec)
  • Per la tabella specifica:

    Supponiamo che le tue TABLE_NAMEsiano "notizie" . Quindi la query SQL sarà-

    SELECT
      TABLE_NAME AS `Table`,
      ROUND(((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024),2) AS `Size (MB)`
    FROM
      information_schema.TABLES
    WHERE
        TABLE_SCHEMA = "news_alert"
      AND
        TABLE_NAME = "news"
    ORDER BY
      (DATA_LENGTH + INDEX_LENGTH)
    DESC;

    Produzione:

    +-------+-----------+
    | Table | Size (MB) |
    +-------+-----------+
    | news  |      0.08 |
    +-------+-----------+
    1 row in set (0.00 sec)

8

Prova il seguente comando shell (sostituisci DB_NAMEcon il nome del tuo database):

mysql -uroot <<<"SELECT table_name AS 'Tables', round(((data_length + index_length) / 1024 / 1024), 2) 'Size in MB' FROM information_schema.TABLES WHERE table_schema = \"DB_NAME\" ORDER BY (data_length + index_length) DESC;" | head

Per la soluzione Drupal / drush, controlla il seguente script di esempio che visualizzerà le tabelle più grandi in uso:

#!/bin/sh
DB_NAME=$(drush status --fields=db-name --field-labels=0 | tr -d '\r\n ')
drush sqlq "SELECT table_name AS 'Tables', round(((data_length + index_length) / 1024 / 1024), 2) 'Size in MB' FROM information_schema.TABLES WHERE table_schema = \"${DB_NAME}\" ORDER BY (data_length + index_length) DESC;" | head -n20

6

Ecco un altro modo di risolverlo usando la riga di comando bash.

for i in mysql -NB -e 'show databases'; do echo $i; mysql -e "SELECT table_name AS 'Tables', round(((data_length+index_length)/1024/1024),2) 'Size in MB' FROM information_schema.TABLES WHERE table_schema =\"$i\" ORDER BY (data_length + index_length) DESC" ; done


6

Se stai usando phpmyadmin, vai alla struttura della tabella

per esempio

Space usage
Data    1.5 MiB
Index   0   B
Total   1.5 Mi

4

Adattato dalla risposta di ChapMic per soddisfare il mio particolare bisogno.

Specifica solo il nome del tuo database, quindi ordina tutte le tabelle in ordine decrescente, dalla più GRANDE alla più PICCOLA tabella all'interno del database selezionato. Richiede solo 1 variabile da sostituire = nome del database.

SELECT 
table_name AS `Table`, 
round(((data_length + index_length) / 1024 / 1024), 2) AS `size`
FROM information_schema.TABLES 
WHERE table_schema = "YOUR_DATABASE_NAME_HERE"
ORDER BY size DESC;

3

Se hai sshaccesso, potresti provare semplicemente du -hc /var/lib/mysql(o diverso datadir, come impostato nel tuo my.cnf).


Finalmente una risposta che non si basa su information_schema. Nel mio caso ha riportato 660
MB

2

Un altro modo di mostrare il numero di file e lo spazio occupato e l'ordinamento da esso.

SELECT
     table_schema as `Database`,
     table_name AS `Table`,
     table_rows AS "Quant of Rows",
     round(((data_length + index_length) / 1024 / 1024/ 1024), 2) `Size in GB`
FROM information_schema.TABLES
WHERE table_schema = 'yourDatabaseName'
ORDER BY (data_length + index_length) DESC;  

L'unica stringa che devi sostituire in questa query è "yourDatabaseName".


2

Trovo che le risposte esistenti non forniscano effettivamente la dimensione delle tabelle sul disco, il che è più utile. Questa query fornisce una stima del disco più accurata rispetto alla dimensione della tabella basata su data_length e indice. Ho dovuto usarlo per un'istanza di AWS RDS in cui non è possibile esaminare fisicamente il disco e controllare le dimensioni dei file.

select NAME as TABLENAME,FILE_SIZE/(1024*1024*1024) as ACTUAL_FILE_SIZE_GB
, round(((data_length + index_length) / 1024 / 1024/1024), 2) as REPORTED_TABLE_SIZE_GB 
from INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES s
join INFORMATION_SCHEMA.TABLES t 
on NAME = Concat(table_schema,'/',table_name)
order by FILE_SIZE desc

1

Calcola la dimensione totale del database alla fine:

(SELECT 
  table_name AS `Table`, 
  round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB` 
  FROM information_schema.TABLES 
  WHERE table_schema = "$DB_NAME"
)
UNION ALL
(SELECT 
  'TOTAL:',
  SUM(round(((data_length + index_length) / 1024 / 1024), 2) )
  FROM information_schema.TABLES 
  WHERE table_schema = "$DB_NAME"
)

1
SELECT TABLE_NAME AS table_name, 
table_rows AS QuantofRows, 
ROUND((data_length + index_length) /1024, 2 ) AS total_size_kb 
FROM information_schema.TABLES
WHERE information_schema.TABLES.table_schema = 'db'
ORDER BY (data_length + index_length) DESC; 

tutti e 2 sopra sono testati su mysql


1

Questo dovrebbe essere testato in mysql, non postgresql:

SELECT table_schema, # "DB Name", 
Round(Sum(data_length + index_length) / 1024 / 1024, 1) # "DB Size in MB" 
FROM   information_schema.tables 
GROUP  BY table_schema; 

Sebbene ciò possa rispondere alla domanda degli autori, manca alcune parole esplicative e / o collegamenti alla documentazione. Gli snippet di codice non elaborati non sono molto utili senza alcune frasi attorno a loro. Puoi anche trovare molto utile come scrivere una buona risposta . Modifica la risposta - Dalla recensione
Nick,

@Nick perché ancora vietato?
William,

Mi dispiace, non conosco la risposta a questo: non sono un moderatore.
Nick,
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.