Jako většina relačních databází poskytuje MySQL užitečná metadata o databázi samotné. Zatímco většina ostatních databází tyto informace označuje jako catalog
, oficiální dokumentace MySQL odkazuje na INFORMATION_SCHEMA
metadata jako tables
.
Bez ohledu na název jsou důležité informace poskytované těmito INFORMATION_SCHEMA
tabulky. Vše z views
a user_privilieges
do columns
a tables
lze nalézt v INFORMATION_SCHEMA
. Pro naše účely nás zajímají zejména tables
metadata, na která se můžeme dotazovat, abychom skutečně extrahovali velikost různých tabulek v systému.
Seznam velikostí tabulek z jedné databáze
Jak je vidět v oficiální dokumentaci, INFORMATION_SCHEMA.TABLES
tabulka obsahuje přibližně 20 sloupců, ale pro účely určení množství místa na disku používaného tabulkami se zaměříme zejména na dva sloupce:DATA_LENGTH
a INDEX_LENGTH
.
DATA_LENGTH
je délka (nebo velikost) všech dat v tabulce (vbytes
).INDEX_LENGTH
je délka (nebo velikost) indexového souboru pro tabulku (také vbytes
).
Vyzbrojeni těmito informacemi můžeme provést dotaz, který zobrazí seznam všech tabulek v konkrétní databázi spolu s místem na disku (velikost) každé z nich. Můžeme se dokonce trochu zdokonalit a převést hodnoty normální velikosti z bytes
do něčeho užitečnějšího a srozumitelnějšího pro většinu lidí, jako jsou 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;
V tomto příkladu pomocí bookstore
databáze, kombinujeme DATA_LENGTH
a INDEX_LENGTH
jako bytes
a poté jej vydělte 1024
dvakrát převést na kilobytes
a poté megabytes
. Naše sada výsledků bude vypadat nějak takto:
+----------------------------------+-----------+
| Table | Size (MB) |
+----------------------------------+-----------+
| book | 267 |
| author | 39 |
| post | 27 |
| cache | 24 |
...
Pokud vás nezajímají všechny tabulky v databázi a chcete pouze velikost konkrétní tabulky, můžete jednoduše přidat AND TABLE_NAME = "your_table_name"
do WHERE
doložka. Zde chceme pouze informace o book
tabulka:
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;
Výsledky, jak se očekávalo, jsou nyní:
+-------+-----------+
| Table | Size (MB) |
+-------+-----------+
| book | 267 |
+-------+-----------+
1 row in set (0.00 sec)
Vypsat všechny velikosti tabulek ze VŠECH databází
Pokud narazíte na problém, kdy se vaše databáze zvětšuje, ale nevíte, která tabulka je na vině, může být užitečné zeptat se na velikost všech tabulky v rámci všech databáze v celém systému. To lze snadno provést pomocí následujícího dotazu:
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;
Tím se vrátí nejen velikost tabulky, ale také název tabulky a nadřazená databáze, ke které je přidružena.