¿Cómo obtener los tamaños de las tablas de una base de datos MySQL?

900

Puedo ejecutar esta consulta para obtener los tamaños de todas las tablas en una base de datos MySQL:

show table status from myDatabaseName;

Quisiera ayuda para entender los resultados. Estoy buscando mesas con los tamaños más grandes.

¿Qué columna debería mirar?

JPashs
fuente
8
¿Qué quieres decir con talla? ¿Número de filas? ¿Bytes tomados en el disco?
Mark Byers
@ Mark quiero tamaño en el disco ¿es este el método correcto? # du -sh /mnt/mysql_data/openx/f_scraper_banner_details.MYI 79G /mnt/mysql_data/openx/f_scraper_banner_details.MYI
Ashish Karpe
3
Relacionado, si es de interés, escribí una descripción de todas las tablas en esta respuesta .
Dibujó el

Respuestas:

1959

Puede usar esta consulta para mostrar el tamaño de una tabla (aunque primero debe sustituir las variables):

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 esta consulta para enumerar el tamaño de cada tabla en cada base de datos, la más grande primero:

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;
ChapMic
fuente
3
Gracias, está funcionando bien, aunque no estoy seguro de que tenga en cuenta a Blobs.
David
55
Tenga en cuenta que también puede usar "IN" para especificar varias tablas, por ejemploAND table_name IN ('table_1', 'table_2', 'table_3');
David Thomas el
66
AFAICT, esto solo contará las longitudes de los campos de tamaño estático correctamente. ¿Cómo contarías VARCHARy BLOBescribirías?
l0b0
44
@kasimir En algún momento, el mundo se volvió confuso y algunas organizaciones de estándares y fabricantes de hardware decidieron que era mejor definir un kilobyte en el sistema decimal. El estándar IEC ahora llama a la base de 2 kilobytes (1024 bytes) un kibibyte (KiB). En cualquier caso, MySQL no lo sabe, así que si quieres kilobytes decimales IEC, divide entre 1000.
russellpierce
99
¿Funcionará esto para el motor de almacenamiento InnoDB? De acuerdo con mysql doc aquí: dev.mysql.com/doc/refman/5.7/en/show-table-status.html , el campo data_length para ese motor contiene el tamaño del índice agrupado. Eso no representará correctamente el tamaño de los datos. Lo hará?
euforia83
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

Puede obtener el nombre del esquema de " información_esquema " -> tabla SCHEMATA -> columna " SCHEMA_NAME "


Adicional Puede obtener el tamaño de las bases de datos mysql de la siguiente manera.

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; 

Resultado

DB Name              |      DB Size in MB

mydatabase_wrdp             39.1
information_schema          0.0

Puede obtener detalles adicionales aquí.

Sumith Harshan
fuente
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; 

Esto ordena los tamaños (Tamaño de DB en MB).

Gank
fuente
31

Si desea que una consulta use la base de datos seleccionada actualmente. simplemente copie y pegue esta consulta. (No se requiere modificación)

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;
zainengineer
fuente
55
O incluso más corto (sin subconsulta): SELECT table_name, round (((data_length + index_length) / 1024/1024), 2) SIZE_MBFROM information_schema.TABLES WHERE table_schema = DATABASE () ORDER BY (data_length + index_length) ASC;
Onkeltem
15

Hay una manera fácil de obtener mucha información usando Workbench:

  • Haga clic derecho en el nombre del esquema y haga clic en "Inspector de esquema".

  • En la ventana resultante tienes varias pestañas. La primera pestaña "Información" muestra una estimación aproximada del tamaño de la base de datos en MB.

  • La segunda pestaña, "Tablas", muestra la longitud de los datos y otros detalles para cada tabla.

Guppy
fuente
No tenía la pestaña 'información' en mi cliente Mac v 6.0.9
Neil
¡¡¡Excelente!!! En MySQL Workbench también hay un "Inspector de tabla" para cada tabla. ¡No es rápido pero sí muy práctico!
T30
11
  • Tamaño de todas las mesas:

    Supongamos que su base de datos o TABLE_SCHEMAnombre es "news_alert". Entonces esta consulta mostrará el tamaño de todas las tablas en la base de datos.

    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;
    

    Salida:

        +---------+-----------+
        | Table   | Size (MB) |
        +---------+-----------+
        | news    |      0.08 |
        | keyword |      0.02 |
        +---------+-----------+
        2 rows in set (0.00 sec)
    
  • Para la tabla específica:

    Supongamos que tu TABLE_NAMEes "noticias" . Entonces la consulta SQL será-

    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;
    

    Salida:

    +-------+-----------+
    | Table | Size (MB) |
    +-------+-----------+
    | news  |      0.08 |
    +-------+-----------+
    1 row in set (0.00 sec)
    
Nurul Akter Towhid
fuente
8

Pruebe el siguiente comando de shell (reemplace DB_NAMEcon el nombre de su base de datos):

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

Para la solución Drupal / drush, verifique el siguiente script de ejemplo que mostrará las tablas más grandes en 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
kenorb
fuente
6

Aquí hay otra forma de resolver esto usando la línea de 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

usuario1380599
fuente
6

Si está utilizando phpmyadmin, simplemente vaya a la estructura de la tabla

p.ej

Space usage
Data    1.5 MiB
Index   0   B
Total   1.5 Mi
Almis
fuente
4

Adaptado de la respuesta de ChapMic para satisfacer mi necesidad particular.

Solo especifique el nombre de su base de datos, luego ordene todas las tablas en orden descendente, desde la tabla MÁS GRANDE a la MÁS PEQUEÑA dentro de la base de datos seleccionada. Solo se necesita reemplazar 1 variable = el nombre de su base de datos.

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;
dev101
fuente
3

Si tiene sshacceso, es posible que desee probar simplemente du -hc /var/lib/mysql(o diferente datadir, como se establece en su my.cnf) también.

exic
fuente
Finalmente una respuesta que no se basa en información_esquema. En mi caso, reportó 660MB mientras que el tamaño real en el sistema de archivos es
1.8GB
2

Otra forma de mostrar el número de filas y el espacio ocupado y ordenar por él.

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;  

La única cadena que debe sustituir en esta consulta es "yourDatabaseName".

Nav
fuente
2

Creo que las respuestas existentes en realidad no dan el tamaño de las tablas en el disco, lo cual es más útil. Esta consulta proporciona una estimación de disco más precisa en comparación con el tamaño de la tabla basada en data_length & index. Tuve que usar esto para una instancia de AWS RDS donde no puede examinar físicamente el disco y verificar los tamaños de los archivos.

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
Ryum Aayur
fuente
1

Calcule el tamaño total de la base de datos al final:

(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"
)
MINGSONG HU
fuente
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; 

los 2 anteriores se prueban en mysql

Guillermo
fuente
1

Esto debería ser probado en mysql, no 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; 
Guillermo
fuente
Si bien esto podría responder a la pregunta de los autores, carece de algunas palabras explicativas y / o enlaces a la documentación. Los fragmentos de código sin formato no son muy útiles sin algunas frases a su alrededor. También puede encontrar cómo escribir una buena respuesta muy útil. Edite su respuesta - De la opinión
Nick
@ Nick, ¿por qué sigue prohibido?
William
Lo siento, no sé la respuesta a eso, no soy moderador.
Nick