Podobnie jak większość relacyjnych baz danych, MySQL zapewnia przydatne metadane dotyczące samej bazy danych. Podczas gdy większość innych baz danych odnosi się do tych informacji jako do catalog
, oficjalna dokumentacja MySQL odnosi się do INFORMATION_SCHEMA
metadane jako tables
.
Niezależnie od nazwy ważne są informacje dostarczone przez te INFORMATION_SCHEMA
tabele. Wszystko z views
i user_privilieges
do columns
i tables
można znaleźć w INFORMATION_SCHEMA
. Dla naszych celów szczególnie interesują nas tables
metadane, o które możemy zapytać, aby faktycznie wyodrębnić rozmiar różnych tabel w systemie.
Lista rozmiarów tabel z jednej bazy danych
Jak widać w oficjalnej dokumentacji, INFORMATION_SCHEMA.TABLES
tabela zawiera około 20 kolumn, ale w celu określenia ilości miejsca na dysku używanej przez tabele skupimy się w szczególności na dwóch kolumnach:DATA_LENGTH
i INDEX_LENGTH
.
DATA_LENGTH
to długość (lub rozmiar) wszystkich danych w tabeli (wbytes
).INDEX_LENGTH
to długość (lub rozmiar) 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 miejscem na dysku (rozmiarem) każdej z nich. Możemy nawet stać się nieco bardziej wyrafinowani i przekonwertować wartości normalnego rozmiaru z bytes
w coś bardziej użytecznego i zrozumiałego dla większości ludzi, takiego jak 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;
W tym przykładzie za pomocą bookstore
bazy danych, łączymy DATA_LENGTH
i INDEX_LENGTH
jako bytes
, a następnie dzieląc przez 1024
dwa razy 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 interesują Cię wszystkie tabele w bazie danych i chcesz mieć tylko rozmiar konkretnej tabeli, możesz po prostu dodać AND TABLE_NAME = "your_table_name"
do WHERE
klauzula. Tutaj chcemy tylko informacji 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;
Wyniki, zgodnie z oczekiwaniami, są teraz:
+-------+-----------+
| Table | Size (MB) |
+-------+-----------+
| book | 267 |
+-------+-----------+
1 row in set (0.00 sec)
Wyświetl wszystkie rozmiary tabel ze WSZYSTKICH baz danych
Jeśli napotykasz problem polegający na tym, że Twoja baza danych rośnie, ale nie wiesz, która tabela jest winowajcą, przydatne może być zapytanie o rozmiar wszystkie tabele w wszystkich bazy 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.TABLES
ORDER BY
(DATA_LENGTH + INDEX_LENGTH)
DESC;
Zwróci to nie tylko rozmiar tabeli, ale także nazwę tabeli i nadrzędną bazę danych, z którą jest powiązana.