Zoals de meeste relationele databases, biedt MySQL nuttige metadata over de database zelf. Terwijl de meeste andere databases naar deze informatie verwijzen als een catalog
, verwijst de officiële MySQL-documentatie naar de INFORMATION_SCHEMA
metadata als tables
.
Ongeacht de naam, het gaat om de informatie die wordt verstrekt door deze INFORMATION_SCHEMA
tafels. Alles van views
en user_privilieges
naar columns
en tables
is te vinden in de INFORMATION_SCHEMA
. Voor onze doeleinden zijn we vooral geïnteresseerd in de tables
metadata, die we kunnen opvragen om de grootte van verschillende tabellen in het systeem daadwerkelijk te extraheren.
Tabelgroottes uit één database weergeven
Zoals te zien is in de officiële documentatie, is de INFORMATION_SCHEMA.TABLES
tabel bevat ongeveer 20 kolommen, maar om de hoeveelheid schijfruimte te bepalen die door tabellen wordt gebruikt, richten we ons in het bijzonder op twee kolommen:DATA_LENGTH
en INDEX_LENGTH
.
DATA_LENGTH
is de lengte (of grootte) van alle gegevens in de tabel (inbytes
).INDEX_LENGTH
is de lengte (of grootte) van het indexbestand voor de tabel (ook inbytes
).
Gewapend met deze informatie kunnen we een query uitvoeren die alle tabellen in een specifieke database samen met de schijfruimte (grootte) van elk zal weergeven. We kunnen zelfs een beetje exclusiever worden en de normale groottewaarden converteren van bytes
in iets dat voor de meeste mensen nuttiger en begrijpelijker is, zoals 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;
In dit voorbeeld met de bookstore
database, combineren we de DATA_LENGTH
en INDEX_LENGTH
als bytes
, en vervolgens te delen door 1024
tweemaal om te zetten in kilobytes
en dan megabytes
. Onze resultatenset ziet er ongeveer zo uit:
+----------------------------------+-----------+
| Table | Size (MB) |
+----------------------------------+-----------+
| book | 267 |
| author | 39 |
| post | 27 |
| cache | 24 |
...
Als u niet om alle tabellen in de database geeft en alleen de grootte van een bepaalde tabel wilt, kunt u eenvoudig AND TABLE_NAME = "your_table_name"
toevoegen naar de WHERE
clausule. Hier willen we alleen informatie over het book
tafel:
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;
De resultaten zijn, zoals verwacht, nu:
+-------+-----------+
| Table | Size (MB) |
+-------+-----------+
| book | 267 |
+-------+-----------+
1 row in set (0.00 sec)
Lijst alle tabelgroottes van ALLE databases
Als u een probleem tegenkomt waarbij uw database groter wordt, maar u niet weet welke tabel de boosdoener is, kan het handig zijn om de grootte van alle op te vragen. tabellen binnen alle databases in het hele systeem. Dit kan eenvoudig worden bereikt met de volgende vraag:
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;
Dit retourneert niet alleen de grootte van de tabel, maar ook de tabelnaam en de bovenliggende database waaraan deze is gekoppeld.