sql >> Databasteknik >  >> RDS >> Mysql

Hur man får storleken på en tabell i MySQL

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 (i bytes ).
  • INDEX_LENGTH är längden (eller storleken) på indexfilen för tabellen (även i bytes ).

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.


  1. MySQL vs MySQLi när du använder PHP

  2. Hur man konfigurerar syntaxmarkering i SQLcl

  3. Vilka rader returneras när du använder LIMIT med OFFSET i MySQL?

  4. Hur man pausar exekveringen av ett uttalande i PostgreSQL