Como você pode determinar quanto espaço em disco uma tabela específica do MySQL está ocupando?

145

Existe uma maneira rápida de determinar quanto espaço em disco uma tabela específica do MySQL está ocupando? A tabela pode ser MyISAM ou Innodb.

dan
fonte
No PHPMyAdmin, você pode ver o uso do espaço simplesmente clicando na tabela.
AR.
As respostas para esta pergunta me ajudaram a obter minha solução. Uma busca completa por uma ferramenta que pudesse me ajudar sem executar a mesma consulta todas as vezes para obter os dados me fez percorrer o MONyog , MySQL Enterprise Monitor , kit de ferramentas Percona . Todos eles fornecem detalhes sobre as informações do disco, mas finalmente optaram pelo MONyog para obter melhores gráficos e facilitar a interface gráfica.
Mathew

Respostas:

285

Para uma tabela, mydb.mytableexecute isso para:

BYTES

SELECT (data_length+index_length) tablesize
FROM information_schema.tables
WHERE table_schema='mydb' and table_name='mytable';

KILOBYTES

SELECT (data_length+index_length)/power(1024,1) tablesize_kb
FROM information_schema.tables
WHERE table_schema='mydb' and table_name='mytable';

MEGABYTES

SELECT (data_length+index_length)/power(1024,2) tablesize_mb
FROM information_schema.tables
WHERE table_schema='mydb' and table_name='mytable';

GIGABYTES

SELECT (data_length+index_length)/power(1024,3) tablesize_gb
FROM information_schema.tables
WHERE table_schema='mydb' and table_name='mytable';

GENÉRICO

Aqui está uma consulta genérica em que a exibição máxima da unidade é TB (TeraBytes)

SELECT 
    CONCAT(FORMAT(DAT/POWER(1024,pw1),2),' ',SUBSTR(units,pw1*2+1,2)) DATSIZE,
    CONCAT(FORMAT(NDX/POWER(1024,pw2),2),' ',SUBSTR(units,pw2*2+1,2)) NDXSIZE,
    CONCAT(FORMAT(TBL/POWER(1024,pw3),2),' ',SUBSTR(units,pw3*2+1,2)) TBLSIZE
FROM
(
    SELECT DAT,NDX,TBL,IF(px>4,4,px) pw1,IF(py>4,4,py) pw2,IF(pz>4,4,pz) pw3
    FROM 
    (
        SELECT data_length DAT,index_length NDX,data_length+index_length TBL,
        FLOOR(LOG(IF(data_length=0,1,data_length))/LOG(1024)) px,
        FLOOR(LOG(IF(index_length=0,1,index_length))/LOG(1024)) py,
        FLOOR(LOG(IF(data_length+index_length=0,1,data_length+index_length))/LOG(1024)) pz
        FROM information_schema.tables
        WHERE table_schema='mydb'
        AND table_name='mytable'
    ) AA
) A,(SELECT 'B KBMBGBTB' units) B;

De uma chance !!!

RolandoMySQLDBA
fonte
6
SELECT (data_length+index_length)/power(1024,2) tablesize_mb, table_name FROM information_schema.tables WHERE table_schema='mydb' order by tablesize_mb;para obter uma lista de todas as tabelas mydbcom nome e tamanho, ordenadas por tamanho.
kqw
1
Acrescente "DESC" à cláusula ORDER BY para ver as tabelas que consomem mais espaço em disco primeiro. ;)
mvsagar
Para ser mais preciso, convém chamar as unidades ki bi bytes (KiB), me bi bytes (MiB) e gi bi bytes (GiB) ao usar prefixos binários (multiplicação com a potência de 2). Ou, convém usar prefixos decimais (multiplicação com a potência de 1000) e chamar as unidades ki lo bytes (KB), me ga bytes (MB) e gi ga bytes (GB). Veja mais: en.wikipedia.org/wiki/Binary_prefix
Márton Tamás
Alguém sabe como fazer o mesmo no MSSQL?
Ivan Yurchenko
@RolandoMySQLDBA, você poderia sugerir neste stackoverflow.com/questions/47976837/…
davidb
15

Bit rápido de SQL para obter as 20 maiores tabelas em MB.

SELECT table_schema, table_name,
  ROUND((data_length+index_length)/POWER(1024,2),2) AS tablesize_mb
FROM information_schema.tables
ORDER BY tablesize_mb DESC LIMIT 20;

Espero que seja útil para alguém!

Ben
fonte
2

No linux com o mysql instalado por padrão:

[you@yourbox]$ ls -lha /var/lib/mysql/<databasename>

baseado na localização mysql db do NIXCRAFT

geekymartian
fonte
A questão é perguntar como medir o espaço ocupado por uma tabela específica .
Flimm
@ShariqueAbdullah isso funcionará se você estiver usando innodb_file_per_table, o que não é padrão, mas acho que é muito comum e / ou recomendado (alguém pode facilmente provar que estou errado nisso, apenas minha impressão).
Seaux
@Seaux, pode ser, mas não o encontrei sendo usado em nenhuma configuração de servidor recomendada pela qual passei. Então você pode estar certo, mas como não é o padrão, ele pode não encontrá-lo. Além disso, acho que o innodb funciona bem diferente comparado ao MyISAM. Portanto, mesmo se você tiver o tamanho do arquivo, ele pode não ser tão preciso quanto seria no caso do MyISAM. Mas você está certo de que pode ser uma solução. Pessoalmente, prefiro usar comandos MySQL para obter essas informações em vez de medir o tamanho dos arquivos.
Sharique Abdullah
2

Com base na resposta do RolandMySQLDBA, acho que podemos usar o acima para obter o tamanho de cada esquema em uma tabela:

SELECT table_schema, SUM((data_length+index_length)/power(1024,1)) tablesize_kb 
    FROM information_schema.tables GROUP BY table_schema;

Gostei muito!

Arthur Felipe
fonte
0

Talvez você possa ver o tamanho dos arquivos ...

Cada tabela é armazenada em dois arquivos separados dentro de uma pasta com o nome que você chamou de banco de dados. Essas pastas são armazenadas no diretório de dados do mysql.

A partir daí, você pode fazer um 'du -sh. *' Para obter o tamanho da tabela em disco.

Luke Chadwick
fonte
Isso funciona apenas para bancos de dados MyISAM. O OP solicitou uma solução que funcione também com o InnoDB.
Bgs
0

Retirado de Como verifico quanto espaço em disco meu banco de dados está usando?

Você pode verificar o tamanho da tabela MySQL olhando no phpMyAdminseu painel de controle clicando no nome do banco de dados no quadro esquerdo e lendo o tamanho das tabelas no quadro direito.

A consulta abaixo também ajudará a obter as mesmas informações em bytes

select SUM(data_length) + SUM(index_length) as total_size 
from information_schema.tables 
where table_schema = 'db_name' 
and table_name='table_name';
Rahul
fonte
Isso pressupõe phpMyAdmin está instalado
thebigjc
-1

Eu usaria apenas a ferramenta ' mysqldiskusage ' da seguinte maneira

$ mysqldiskusage --server=user:password@localhost mydbname
# Source on localhost: ... connected.

# Database totals:
+------------+----------------+
| db_name    |         total  |
+------------+----------------+
| mydbaname  | 5,403,033,600  |
+------------+----------------+

Total database disk usage = 5,403,033,600 bytes or 5.03 GB
Natouriano
fonte
O OP pediu espaço em disco de particular a tabela MySQL, e não todo o banco de dados
machineaddict