Como obter os tamanhos das tabelas de um banco de dados MySQL?


900

Eu posso executar esta consulta para obter os tamanhos de todas as tabelas em um banco de dados MySQL:

show table status from myDatabaseName;

Eu gostaria de alguma ajuda para entender os resultados. Estou à procura de mesas com os maiores tamanhos.

Qual coluna devo olhar?


8
O que você quer dizer com tamanho? Numero de linhas? Bytes tirados no disco?
precisa

@ Mark eu quero tamanho no disco é este método certo? # du -sh /mnt/mysql_data/openx/f_scraper_banner_details.MYI 79G /mnt/mysql_data/openx/f_scraper_banner_details.MYI
Ashish Karpe

3
Relacionada, se for de interesse, eu escrevi uma Descreva todas as tabelas em esta resposta .
Tirou

Respostas:


1958

Você pode usar esta consulta para mostrar o tamanho de uma tabela (embora seja necessário substituir primeiro as variáveis):

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

ou esta consulta para listar o tamanho de cada tabela em cada banco de dados, maior primeiro:

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
Obrigado, está funcionando muito bem, embora eu não tenha certeza de que leva Blobs em consideração.
David

5
Note, você também pode usar "IN" para especificar várias tabelas, por exemploAND table_name IN ('table_1', 'table_2', 'table_3');
David Thomas

6
AFAICT, isso contará apenas os comprimentos dos campos de tamanho estático corretamente. Como você contaria VARCHARe BLOBescreveria?
L0b0

3
@kasimir Em algum momento, o mundo ficou confuso e algumas organizações de padrões e fabricantes de hardware decidiram que era melhor definir um kilobyte no sistema decimal. O padrão IEC agora chama os 2 kilobytes base (1024 bytes) de kibibyte (KiB). De qualquer forma, o MySQL não sabe, então se você quiser kilobytes decimais IEC, divida por 1000.
russellpierce

9
Isso funcionará para o mecanismo de armazenamento InnoDB? De acordo com o documento do mysql aqui - dev.mysql.com/doc/refman/5.7/en/show-table-status.html , o campo data_length para esse mecanismo contém o tamanho do índice em cluster. Isso não representa corretamente o tamanho dos dados. Vai?
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

Você pode obter o nome do esquema na coluna " information_schema " -> tabela SCHEMATA -> " SCHEMA_NAME "


Adicional Você pode obter o tamanho dos bancos de dados mysql da seguinte maneira.

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

Você pode obter detalhes adicionais aqui.


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; 

Isso classifica os tamanhos (tamanho do banco de dados em MB).


31

Se você deseja que uma consulta use o banco de dados selecionado no momento. basta copiar e colar esta consulta. (Nenhuma modificação necessária)

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
Ou ainda mais curto (sem 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

Existe uma maneira fácil de obter muitas informações usando o Workbench:

  • Clique com o botão direito do mouse no nome do esquema e clique em "Inspetor de esquema".

  • Na janela resultante, você tem várias guias. A primeira guia "Informações" mostra uma estimativa aproximada do tamanho do banco de dados em MB.

  • A segunda guia, "Tabelas", mostra o comprimento dos dados e outros detalhes para cada tabela.


Eu não tinha a guia 'informações' no meu cliente Mac v 6.0.9
Neil

Ótimo!!! No MySQL Workbench também há um "Table Inspector" para cada tabela. Não é adequadamente rápido, mas muito útil!
T30

11
  • Tamanho de todas as tabelas:

    Suponha que seu banco de dados ou TABLE_SCHEMAnome seja "news_alert". Em seguida, essa consulta mostrará o tamanho de todas as tabelas no banco de dados.

    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;

    Resultado:

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

    Suponha que você TABLE_NAMEé "notícia" . A 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;

    Resultado:

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

8

Experimente o seguinte comando shell (substitua DB_NAMEpelo nome do banco de dados):

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 solução Drupal / drush, verifique o seguinte exemplo de script que exibirá as maiores tabelas em 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

Aqui está outra maneira de resolver isso usando a linha de comando do 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 você estiver usando o phpmyadmin, basta ir para a estrutura da tabela

por exemplo

Space usage
Data    1.5 MiB
Index   0   B
Total   1.5 Mi

4

Adaptado da resposta do ChapMic para atender às minhas necessidades particulares.

Especifique apenas o nome do banco de dados e, em seguida, classifique todas as tabelas em ordem decrescente - da tabela MAIOR para a MAIS PEQUENA dentro do banco de dados selecionado. Precisa apenas de 1 variável para ser substituída = o nome do seu banco de dados.

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 você tiver sshacesso, tente também du -hc /var/lib/mysql(ou diferente datadir, conforme definido no seu my.cnf).


Finalmente, uma resposta que não depende de information_schema. No meu caso, ele relatou 660 MB enquanto o tamanho real do sistema de arquivos é de
1,8 GB

2

Outra maneira de mostrar o número de linhas e o espaço ocupado e ordenado por ele.

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;  

A única string que você deve substituir nesta consulta é "yourDatabaseName".


2

Acho que as respostas existentes não fornecem o tamanho das tabelas no disco, o que é mais útil. Essa consulta fornece uma estimativa de disco mais precisa em comparação com o tamanho da tabela com base no comprimento e no índice de dados. Eu tive que usar isso para uma instância do AWS RDS em que você não pode examinar fisicamente o disco e verificar o tamanho do arquivo.

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

Calcule o tamanho total do banco de dados no 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"
)

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; 

todos os 2 acima são testados no mysql


1

Isso deve ser testado no mysql, não 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; 

Embora isso possa responder à pergunta dos autores, faltam algumas palavras explicativas e / ou links para a documentação. Os trechos de código bruto não são muito úteis sem algumas frases ao seu redor. Você também pode descobrir como escrever uma boa resposta muito útil. Por favor, edite sua resposta - Da avaliação
Nick

@ Nick por que ainda banido?
William William

Desculpe, não sei a resposta para isso - não sou moderador.
18418 Nick
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.