Som de flesta relationsdatabaser tillhandahåller MySQL användbar metadata om själva databasen. Medan de flesta andra databaser refererar till denna information som en catalog
, hänvisar den officiella MySQL-dokumentationen till INFORMATION_SCHEMA
metadata som tables
.
Oavsett namn, det som är viktigt är informationen som tillhandahålls av dessa INFORMATION_SCHEMA
tabeller. Allt från views
och user_privilieges
till columns
och tables
finns i INFORMATION_SCHEMA
. För våra ändamål är vi särskilt intresserade av tables
metadata, som vi kan fråga för att faktiskt extrahera storleken på olika tabeller i systemet.
Lista tabellstorlekar från en enda databas
Som kan ses i den officiella dokumentationen, INFORMATION_SCHEMA.TABLES
Tabellen innehåller cirka 20 kolumner, men för att bestämma mängden diskutrymme som används av tabeller kommer vi att fokusera på två kolumner i synnerhet:DATA_LENGTH
och INDEX_LENGTH
.
DATA_LENGTH
är längden (eller storleken) på all data i tabellen (ibytes
).INDEX_LENGTH
är längden (eller storleken) på indexfilen för tabellen (även ibytes
).
Med denna information kan vi köra en fråga som kommer att lista alla tabeller i en specifik databas tillsammans med diskutrymmet (storleken) för var och en. Vi kan till och med bli lite finare och konvertera de normala storleksvärdena från bytes
till något mer användbart och begripligt för de flesta 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 det här exemplet använder du bookstore
databasen kombinerar vi DATA_LENGTH
och INDEX_LENGTH
som bytes
, och dividera det sedan med 1024
två gånger för att konvertera till kilobytes
och sedan megabytes
. Vår resultatuppsättning kommer att se ut ungefär så här:
+----------------------------------+-----------+
| Table | Size (MB) |
+----------------------------------+-----------+
| book | 267 |
| author | 39 |
| post | 27 |
| cache | 24 |
...
Om du inte bryr dig om alla tabeller i databasen och bara vill ha storleken på en viss tabell kan du helt enkelt lägga till AND TABLE_NAME = "your_table_name"
till WHERE
klausul. Här vill vi bara ha information om book
tabell:
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;
Resultaten, som förväntat, är nu:
+-------+-----------+
| Table | Size (MB) |
+-------+-----------+
| book | 267 |
+-------+-----------+
1 row in set (0.00 sec)
Lista alla tabellstorlekar från ALLA databaser
Om du stöter på ett problem där din databas växer i storlek men du inte vet vilken tabell som är boven kan det vara användbart att fråga efter storleken på alla tabeller inom alla databaser i hela systemet. Detta kan enkelt åstadkommas med följande fråga:
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;
Detta returnerar inte bara tabellens storlek, utan även tabellnamnet och den överordnade databasen som den är associerad med.