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_LENGTHje délka (nebo velikost) všech dat v tabulce (vbytes).INDEX_LENGTHje 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.