Jak określić, ile miejsca na dysku zajmuje dana tabela MySQL?

145

Czy istnieje szybki sposób określenia, ile miejsca na dysku zajmuje dana tabela MySQL? Tabelą może być MyISAM lub Innodb.

dan
źródło
W PHPMyAdmin możesz zobaczyć użycie miejsca, klikając po prostu na tabeli.
AR.
Odpowiedzi na to pytanie pomogły mi znaleźć rozwiązanie. Dokładne poszukiwanie narzędzia, które mogłoby mi pomóc bez wykonywania za każdym razem tego samego zapytania w celu uzyskania danych, sprawiło, że przeszedłem przez MONyog , MySQL Enterprise Monitor , zestaw narzędzi Percona . Wszyscy podają szczegóły dotyczące informacji o dysku, ale ostatecznie wybrali MONyog, aby uzyskać lepsze wykresy graficzne i łatwy GUI.
Mathew

Odpowiedzi:

285

W przypadku tabeli mydb.mytableuruchom to dla:

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

MEGABYTY

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

OGÓLNY

Oto ogólne zapytanie, w którym maksymalna wyświetlana jednostka to TB (terabajty)

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;

Spróbuj !!!

RolandoMySQLDBA
źródło
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;aby uzyskać listę wszystkich tabel o mydbnazwie i rozmiarze, uporządkowaną według rozmiaru.
kqw
1
Dołącz „DESC” do klauzuli ORDER BY, aby zobaczyć tabele, które w pierwszej kolejności zajmują więcej miejsca na dysku. ;)
mvsagar
Aby być precyzyjnym, możesz chcieć wywołać jednostki ki bi bajty (KiB), me bi bajty (MiB) i gi bi bajty (GiB), używając przedrostków binarnych (mnożenie z potęgą 2). Lub możesz użyć prefiksów dziesiętnych (mnożenie z potęgą 1000), a następnie wywołać jednostki ki lo bajty (KB), me ga bajty (MB) i gi ga bajty (GB). Zobacz więcej: en.wikipedia.org/wiki/Binary_prefix
Márton Tamás
Czy ktoś wie, jak zrobić to samo w MSSQL?
Ivan Yurchenko
@RolandoMySQLDBA, czy mógłbyś zasugerować na tym stackoverflow.com/questions/47976837/ ...
davidb
15

Szybki bit SQL, aby uzyskać 20 największych tabel w 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;

Mam nadzieję, że to komuś się przyda!

Ben
źródło
2

W Linuksie z domyślnie zainstalowanym mysql:

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

w oparciu o lokalizację bazy danych mysql firmy NIXCRAFT

geekymartian
źródło
Pytanie brzmi, jak zmierzyć przestrzeń zajmowaną przez konkretny stół .
Flimm
@ShariqueAbdullah to zadziała, jeśli używasz innodb_file_per_table, co nie jest domyślne, ale myślę, że jest bardzo powszechne i / lub zalecane (ktoś może łatwo udowodnić, że się mylę, tylko moje wrażenie).
Seaux,
@Seaux, może być, ale nie znalazłem go używanego w żadnej zalecanej konfiguracji serwera, przez którą przeszedłem. Więc możesz mieć rację, ale ponieważ nie jest to domyślne, może go nie znaleźć. Myślę też, że innodb działa zupełnie inaczej niż MyISAM. Więc nawet jeśli masz rozmiar pliku, może on nie być tak dokładny, jak w przypadku MyISAM. Ale masz rację, to może być jedno rozwiązanie. Osobiście wolę używać poleceń MySQL, aby uzyskać te informacje, zamiast mierzyć rozmiary plików.
Sharique Abdullah
2

Opierając się na odpowiedzi RolandMySQLDBA, myślę, że możemy wykorzystać powyższe, aby uzyskać rozmiar każdego schematu w tabeli:

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

Naprawdę mi się podobało!

Arthur Felipe
źródło
0

Możesz przyjrzeć się rozmiarowi plików ...

Każda tabela jest przechowywana w kilku oddzielnych plikach w folderze o nazwie takiej, jaką nazwiesz w swojej bazie danych. Te foldery są przechowywane w katalogu danych mysql.

Stamtąd możesz wykonać 'du -sh. *', Aby uzyskać rozmiar tabeli na dysku.

Luke Chadwick
źródło
Działa to tylko w przypadku baz danych MyISAM. OP poprosił o rozwiązanie, które współpracuje również z InnoDB.
Bgs
0

Zaczerpnięte z Jak mogę sprawdzić, ile miejsca na dysku używa moja baza danych?

Możesz sprawdzić rozmiar tabeli MySQL, patrząc na phpMyAdminpanel sterowania, klikając nazwę bazy danych w lewej ramce i odczytując rozmiar tabel w prawej ramce.

Poniższe zapytanie również pomoże uzyskać te same informacje 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
źródło
Zakłada się, że phpMyAdmin jest zainstalowany
thebigjc
-1

Po prostu użyłbym narzędzia „ mysqldiskusage ” w następujący sposób

$ 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
źródło
OP poprosił o miejsce na dysku dla konkretnej tabeli MySQL, a nie całej bazy danych
machineaddict