Como la mayoría de las bases de datos relacionales, MySQL proporciona metadatos útiles sobre la propia base de datos. Mientras que la mayoría de las otras bases de datos se refieren a esta información como un catalog
, la documentación oficial de MySQL hace referencia a INFORMATION_SCHEMA
metadatos como tables
.
Independientemente del nombre, lo que importa es la información proporcionada por estos INFORMATION_SCHEMA
mesas. Todo desde views
y user_privilieges
a columns
y tables
se puede encontrar en el INFORMATION_SCHEMA
. Para nuestros propósitos, estamos particularmente interesados en las tables
metadatos, que podemos consultar para extraer realmente el tamaño de varias tablas en el sistema.
Lista de tamaños de tablas de una sola base de datos
Como se puede ver en la documentación oficial, el INFORMATION_SCHEMA.TABLES
La tabla contiene alrededor de 20 columnas, pero con el fin de determinar la cantidad de espacio en disco utilizado por las tablas, nos centraremos en dos columnas en particular:DATA_LENGTH
y INDEX_LENGTH
.
DATA_LENGTH
es la longitud (o tamaño) de todos los datos de la tabla (enbytes
).INDEX_LENGTH
es la longitud (o tamaño) del archivo de índice de la tabla (también enbytes
).
Armados con esta información, podemos ejecutar una consulta que enumerará todas las tablas en una base de datos específica junto con el espacio en disco (tamaño) de cada una. Incluso podemos ser un poco más sofisticados y convertir los valores de tamaño normal de bytes
en algo más útil y comprensible para la mayoría de las personas como 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;
En este ejemplo usando la bookstore
base de datos, estamos combinando DATA_LENGTH
y INDEX_LENGTH
como bytes
, luego dividiéndolo por 1024
dos veces para convertir en kilobytes
y luego megabytes
. Nuestro conjunto de resultados se verá así:
+----------------------------------+-----------+
| Table | Size (MB) |
+----------------------------------+-----------+
| book | 267 |
| author | 39 |
| post | 27 |
| cache | 24 |
...
Si no le interesan todas las tablas de la base de datos y solo quiere el tamaño de una tabla en particular, simplemente puede agregar AND TABLE_NAME = "your_table_name"
al WHERE
cláusula. Aquí solo queremos información sobre el book
tabla:
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;
Los resultados, como se esperaba, son ahora:
+-------+-----------+
| Table | Size (MB) |
+-------+-----------+
| book | 267 |
+-------+-----------+
1 row in set (0.00 sec)
Lista de todos los tamaños de tabla de TODAS las bases de datos
Si se encuentra con un problema en el que su base de datos crece en tamaño pero no sabe qué tabla es la culpable, puede ser útil consultar el tamaño de todas. tablas dentro de todas bases de datos en todo el sistema. Esto se puede lograr fácilmente con la siguiente consulta:
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;
Esto devolverá no solo el tamaño de la tabla, sino también el nombre de la tabla y la base de datos principal a la que está asociada.