Som de fleste relationelle databaser giver MySQL nyttige metadata om selve databasen. Mens de fleste andre databaser henviser til disse oplysninger som et catalog
, henviser den officielle MySQL-dokumentation til INFORMATION_SCHEMA
metadata som tables
.
Uanset navnet, er det vigtige oplysningerne fra disse INFORMATION_SCHEMA
tabeller. Alt fra views
og user_privilieges
til columns
og tables
kan findes i INFORMATION_SCHEMA
. Til vores formål er vi særligt interesserede i tables
metadata, som vi kan forespørge for faktisk at udtrække størrelsen af forskellige tabeller i systemet.
Liste tabelstørrelser fra en enkelt database
Som det kan ses i den officielle dokumentation, er INFORMATION_SCHEMA.TABLES
tabel indeholder omkring 20 kolonner, men med det formål at bestemme mængden af diskplads, der bruges af tabeller, vil vi fokusere på især to kolonner:DATA_LENGTH
og INDEX_LENGTH
.
DATA_LENGTH
er længden (eller størrelsen) af alle data i tabellen (ibytes
).INDEX_LENGTH
er længden (eller størrelsen) af indeksfilen for tabellen (også ibytes
).
Bevæbnet med disse oplysninger kan vi udføre en forespørgsel, der viser alle tabeller i en specifik database sammen med diskpladsen (størrelsen) af hver. Vi kan endda blive en smule mere avancerede og konvertere de normale størrelsesværdier fra bytes
til noget mere nyttigt og forståeligt for de fleste mennesker som 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;
I dette eksempel ved hjælp af bookstore
databasen, kombinerer vi DATA_LENGTH
og INDEX_LENGTH
som bytes
, og derefter dividere det med 1024
to gange at konvertere til kilobytes
og derefter megabytes
. Vores resultatsæt vil se nogenlunde således ud:
+----------------------------------+-----------+
| Table | Size (MB) |
+----------------------------------+-----------+
| book | 267 |
| author | 39 |
| post | 27 |
| cache | 24 |
...
Hvis du er ligeglad med alle tabeller i databasen og kun ønsker størrelsen på en bestemt tabel, kan du blot tilføje AND TABLE_NAME = "your_table_name"
til WHERE
klausul. Her ønsker vi kun information om book
tabel:
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;
Resultaterne er som forventet nu:
+-------+-----------+
| Table | Size (MB) |
+-------+-----------+
| book | 267 |
+-------+-----------+
1 row in set (0.00 sec)
Vis alle tabelstørrelser fra ALLE databaser
Hvis du støder på et problem, hvor din database vokser i størrelse, men du ikke ved, hvilken tabel der er synderen, kan det være nyttigt at forespørge efter størrelsen på alle tabeller i alle databaser i hele systemet. Dette kan nemt opnås med følgende forespørgsel:
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;
Dette returnerer ikke kun størrelsen af tabellen, men også tabelnavnet og den overordnede database, den er knyttet til.