Como a maioria dos bancos de dados relacionais, o MySQL fornece metadados úteis sobre o próprio banco de dados. Enquanto a maioria dos outros bancos de dados se referem a essas informações como um
catalog
, a documentação oficial do MySQL se refere ao INFORMATION_SCHEMA
metadados como tables
. Independentemente do nome, o que importa são as informações fornecidas por estes
INFORMATION_SCHEMA
mesas. Tudo de views
e user_privilieges
para columns
e tables
pode ser encontrado no INFORMATION_SCHEMA
. Para nossos propósitos, estamos particularmente interessados nas tables
metadados, que podemos consultar para realmente extrair o tamanho de várias tabelas no sistema. Listar tamanhos de tabela de um único banco de dados
Como pode ser visto na documentação oficial, o
INFORMATION_SCHEMA.TABLES
table contém cerca de 20 colunas, mas para determinar a quantidade de espaço em disco usado pelas tabelas, vamos nos concentrar em duas colunas em particular:DATA_LENGTH
e INDEX_LENGTH
. DATA_LENGTH
é o comprimento (ou tamanho) de todos os dados na tabela (embytes
).INDEX_LENGTH
é o comprimento (ou tamanho) do arquivo de índice para a tabela (também embytes
).
De posse dessas informações, podemos executar uma consulta que listará todas as tabelas de um banco de dados específico juntamente com o espaço em disco (tamanho) de cada uma. Podemos até ficar um pouco mais sofisticados e converter os valores de tamanho normal de
bytes
em algo mais útil e compreensível para a maioria das pessoas 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;
Neste exemplo usando a
bookstore
banco de dados, estamos combinando o DATA_LENGTH
e INDEX_LENGTH
como bytes
, dividindo-o por 1024
duas vezes para converter em kilobytes
e então megabytes
. Nosso conjunto de resultados ficará mais ou menos assim:+----------------------------------+-----------+
| Table | Size (MB) |
+----------------------------------+-----------+
| book | 267 |
| author | 39 |
| post | 27 |
| cache | 24 |
...
Se você não se importa com todas as tabelas no banco de dados e deseja apenas o tamanho de uma tabela específica, basta adicionar
AND TABLE_NAME = "your_table_name"
para WHERE
cláusula. Aqui queremos apenas informações sobre o book
tabela: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;
Os resultados, como esperado, agora são:
+-------+-----------+
| Table | Size (MB) |
+-------+-----------+
| book | 267 |
+-------+-----------+
1 row in set (0.00 sec)
Listar todos os tamanhos de tabela de TODOS os bancos de dados
Se você estiver enfrentando um problema em que seu banco de dados está crescendo em tamanho, mas não sabe qual tabela é a culpada, pode ser útil consultar o tamanho de todos tabelas dentro de todos bancos de dados em todo o sistema. Isso pode ser feito facilmente com a seguinte 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;
Isso retornará não apenas o tamanho da tabela, mas também o nome da tabela e o banco de dados pai ao qual ela está associada.