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_LENGTHis de lengte (of grootte) van alle gegevens in de tabel (inbytes).INDEX_LENGTHis 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.