Hur man får fram storleken på en tabell i MySQL
On december 17, 2021 by adminSom de flesta relationsdatabaser tillhandahåller MySQL användbara metadata om själva databasen. Medan de flesta andra databaser hänvisar till denna information som en catalog
, hänvisar den officiella MySQL-dokumentationen till INFORMATION_SCHEMA
-metadata som tables
.
Oavsett namnet är det viktiga den information 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 syften är vi särskilt intresserade av tables
-metadata, som vi kan fråga efter för att faktiskt ta fram storleken på olika tabeller i systemet.
List Table Sizes From a Single Database
Som framgår av den officiella dokumentationen innehåller INFORMATION_SCHEMA.TABLES
-tabellen cirka 20 kolumner, men för att bestämma hur mycket diskutrymme som tabellerna använder fokuserar vi på två kolumner i synnerhet: DATA_LENGTH
och INDEX_LENGTH
.
-
DATA_LENGTH
är längden (eller storleken) på alla data i tabellen (ibytes
). -
INDEX_LENGTH
är längden (eller storleken) på indexfilen för tabellen (även den ibytes
).
Med den här informationen kan vi utföra en fråga som listar alla tabeller i en specifik databas tillsammans med diskutrymmet (storleken) för varje. 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.TABLESWHERE TABLE_SCHEMA = "bookstore"ORDER BY (DATA_LENGTH + INDEX_LENGTH)DESC;
I det här exemplet, där vi använder databasen bookstore
, kombinerar vi DATA_LENGTH
och INDEX_LENGTH
som bytes
, och dividerar sedan med 1024
två gånger för att omvandla det 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"
i WHERE
-klausulen. Här vill vi bara ha information om tabellen book
:
SELECT TABLE_NAME AS `Table`, ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024) AS `Size (MB)`FROM information_schema.TABLESWHERE TABLE_SCHEMA = "bookstore" AND TABLE_NAME = "book"ORDER BY (DATA_LENGTH + INDEX_LENGTH)DESC;
Resultaten blir som väntat nu:
+-------+-----------+| Table | Size (MB) |+-------+-----------+| book | 267 |+-------+-----------+1 row in set (0.00 sec)
List All Table Sizes From ALL Databases
Om du stöter på ett problem där din databas växer i storlek men du inte vet vilken tabell som är boven i dramat kan det vara användbart att fråga efter storleken på alla tabeller i alla databaser i hela systemet. Detta kan enkelt göras 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.TABLESORDER BY (DATA_LENGTH + INDEX_LENGTH)DESC;
Detta returnerar inte bara storleken på tabellen, utan även tabellens namn och den överordnade databasen som den är associerad med.
Lämna ett svar