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

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

show table status from myDatabaseName; 

Me gustaría algo de ayuda para entender los resultados. Estoy buscando tablas con los tamaños más grandes.

¿Qué columna debería ver?

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 mostrar 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; 
 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 de esquema de la columna ” information_schema ” -> tabla SCHEMATA -> ” 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í.

 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).

Si desea una consulta para usar la base de datos actualmente seleccionada. 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; 

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

  • Haga clic derecho en el nombre del esquema y haga clic en “Schema inspector”.

  • En la ventana resultante tienes varias tabs. 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.

Si estás usando phpmyadmin, solo ve a la estructura de la tabla

p.ej

 Space usage Data 1.5 MiB Index 0 B Total 1.5 Mi 

Pruebe el siguiente comando de shell (reemplace DB_NAME con su nombre de 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 

Supongamos que su nombre de base de datos es “news_alert”. Luego, esta consulta mostrará el tamaño de todas las tablas en la base de datos.

Tamaño de todas las tablas:

 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 tabla específica:

 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) 

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

Adaptado de la respuesta de ChapMic a 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 hasta la MÁS PEQUEÑA dentro de la base de datos seleccionada. Solo necesita 1 variable para ser reemplazada = su nombre de 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; 

Otra forma de mostrar el número de filas y el espacio ocupado y ordenado 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”.

Si tiene acceso ssh , puede intentar simplemente du -hc /var/lib/mysql (o un diferente datadir , como se establece en su my.cnf ).

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" ) 
 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; 
 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