Jak uzyskać rozmiar tabeli w MySQL
On 17 grudnia, 2021 by adminJak większość relacyjnych baz danych, MySQL dostarcza użytecznych metadanych o samej bazie danych. Podczas gdy większość innych baz danych odnosi się do tych informacji jako catalog
, oficjalna dokumentacja MySQL odnosi się do metadanych INFORMATION_SCHEMA
jako tables
.
Niezależnie od nazwy, ważne są informacje dostarczane przez te INFORMATION_SCHEMA
tabele. Wszystko od views
i user_privilieges
do columns
i tables
można znaleźć w INFORMATION_SCHEMA
. Dla naszych celów szczególnie interesują nas metadane tables
, które możemy odpytywać, aby faktycznie wyodrębnić rozmiary różnych tabel w systemie.
List Table Sizes From a Single Database
Jak widać w oficjalnej dokumentacji, tabela INFORMATION_SCHEMA.TABLES
zawiera około 20 kolumn, ale dla celów określenia ilości miejsca na dysku wykorzystywanego przez tabele skupimy się w szczególności na dwóch kolumnach: DATA_LENGTH
i INDEX_LENGTH
.
-
DATA_LENGTH
jest długością (lub rozmiarem) wszystkich danych w tabeli (wbytes
). -
INDEX_LENGTH
jest długością (lub rozmiarem) pliku indeksu dla tabeli (również wbytes
).
Uzbrojeni w te informacje, możemy wykonać zapytanie, które wyświetli listę wszystkich tabel w określonej bazie danych wraz z przestrzenią dyskową (rozmiarem) każdej z nich. Możemy nawet zrobić się nieco bardziej fantazyjni i przekonwertować normalne wartości rozmiaru z bytes
na coś bardziej użytecznego i zrozumiałego dla większości ludzi, jak megabytes
.
SELECT TABLE_NAME AS `Table`, ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024) AS `Size (MB)`FROM information_schema.TABLESWHERE TABLE_SCHEMA = "bookstore"ORDER BY (DATA_LENGTH + INDEX_LENGTH)DESC;
W tym przykładzie, używając bazy danych bookstore
, łączymy DATA_LENGTH
i INDEX_LENGTH
jako bytes
, następnie dzielimy to przez 1024
dwa razy, aby przekonwertować na kilobytes
, a następnie megabytes
. Nasz zestaw wyników będzie wyglądał mniej więcej tak:
+----------------------------------+-----------+| Table | Size (MB) |+----------------------------------+-----------+| book | 267 || author | 39 || post | 27 || cache | 24 |...
Jeśli nie zależy nam na wszystkich tabelach w bazie danych, a jedynie na rozmiarze konkretnej tabeli, możemy po prostu dodać AND TABLE_NAME = "your_table_name"
do klauzuli WHERE
. Tutaj chcemy tylko informacji o tabeli book
:
SELECT TABLE_NAME AS `Table`, ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024) AS `Size (MB)`FROM information_schema.TABLESWHERE TABLE_SCHEMA = "bookstore" AND TABLE_NAME = "book"ORDER BY (DATA_LENGTH + INDEX_LENGTH)DESC;
Wyniki, zgodnie z oczekiwaniami, są teraz:
+-------+-----------+| Table | Size (MB) |+-------+-----------+| book | 267 |+-------+-----------+1 row in set (0.00 sec)
List All Table Sizes From ALL Databases
Jeśli napotkasz problem, w którym Twoja baza danych zwiększa swój rozmiar, ale nie wiesz, która tabela jest winowajcą, użyteczne może być zapytanie o rozmiar wszystkich tabel we wszystkich bazach danych w całym systemie. Można to łatwo osiągnąć za pomocą następującego zapytania:
SELECT TABLE_SCHEMA AS `Database`, TABLE_NAME AS `Table`, ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024) AS `Size (MB)`FROM information_schema.TABLESORDER BY (DATA_LENGTH + INDEX_LENGTH)DESC;
Zwróci to nie tylko rozmiar tabeli, ale także nazwę tabeli i bazę danych, z którą jest powiązana.
Dodaj komentarz