Wie die meisten relationalen Datenbanken stellt MySQL nützliche Metadaten über die Datenbank selbst bereit. Während die meisten anderen Datenbanken diese Informationen als catalog
bezeichnen , bezieht sich die offizielle MySQL-Dokumentation auf das INFORMATION_SCHEMA
Metadaten als tables
.
Unabhängig vom Namen kommt es auf die Informationen an, die diese INFORMATION_SCHEMA
liefern Tische. Alles aus views
und user_privilieges
in columns
und tables
finden Sie im INFORMATION_SCHEMA
. Für unsere Zwecke interessieren uns vor allem die tables
Metadaten, die wir abfragen können, um die tatsächliche Größe verschiedener Tabellen im System zu extrahieren.
Tabellengrößen aus einer einzigen Datenbank auflisten
Wie in der offiziellen Dokumentation zu sehen ist, die INFORMATION_SCHEMA.TABLES
Tabelle enthält ungefähr 20 Spalten, aber um den von Tabellen belegten Speicherplatz zu bestimmen, konzentrieren wir uns besonders auf zwei Spalten:DATA_LENGTH
und INDEX_LENGTH
.
DATA_LENGTH
ist die Länge (oder Größe) aller Daten in der Tabelle (inbytes
).INDEX_LENGTH
ist die Länge (oder Größe) der Indexdatei für die Tabelle (auch inbytes
).
Ausgestattet mit diesen Informationen können wir eine Abfrage ausführen, die alle Tabellen in einer bestimmten Datenbank zusammen mit dem Speicherplatz (Größe) jeder Tabelle auflistet. Wir können sogar etwas ausgefallener werden und die normalen Größenwerte von bytes
umwandeln in etwas Nützlicheres und für die meisten Menschen Verständlicheres wie 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 diesem Beispiel wird der bookstore
verwendet Datenbank kombinieren wir die DATA_LENGTH
und INDEX_LENGTH
als bytes
, dann dividieren Sie ihn durch 1024
zweimal in kilobytes
umzuwandeln und dann megabytes
. Unsere Ergebnismenge sieht in etwa so aus:
+----------------------------------+-----------+
| Table | Size (MB) |
+----------------------------------+-----------+
| book | 267 |
| author | 39 |
| post | 27 |
| cache | 24 |
...
Wenn Ihnen nicht alle Tabellen in der Datenbank wichtig sind und Sie nur die Größe einer bestimmten Tabelle möchten, können Sie einfach AND TABLE_NAME = "your_table_name"
hinzufügen zum WHERE
Klausel. Hier wollen wir nur Informationen über das book
Tabelle:
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;
Die Ergebnisse lauten nun erwartungsgemäß:
+-------+-----------+
| Table | Size (MB) |
+-------+-----------+
| book | 267 |
+-------+-----------+
1 row in set (0.00 sec)
Alle Tabellengrößen aus ALLEN Datenbanken auflisten
Wenn Sie auf ein Problem stoßen, bei dem Ihre Datenbank an Größe zunimmt, Sie aber nicht wissen, welche Tabelle der Übeltäter ist, kann es hilfreich sein, die Größe von all abzufragen Tabellen in alle Datenbanken im gesamten System. Dies kann einfach mit der folgenden Abfrage erreicht werden:
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;
Dies gibt nicht nur die Größe der Tabelle zurück, sondern auch den Tabellennamen und die übergeordnete Datenbank, mit der sie verknüpft ist.