Подобно на повечето релационни бази данни, MySQL предоставя полезни метаданни за самата база данни. Докато повечето други бази данни се отнасят към тази информация като catalog
, официалната документация на MySQL се отнася до INFORMATION_SCHEMA
метаданни като tables
.
Независимо от името, това, което има значение, е информацията, предоставена от тези INFORMATION_SCHEMA
маси. Всичко от views
и user_privilieges
към columns
и tables
може да се намери в INFORMATION_SCHEMA
. За нашите цели се интересуваме особено от tables
метаданни, които можем да поискаме, за да извлечем действително размера на различни таблици в системата.
Списък с размери на таблици от една база данни
Както може да се види в официалната документация, INFORMATION_SCHEMA.TABLES
таблицата съдържа около 20 колони, но с цел определяне на количеството дисково пространство, използвано от таблиците, ще се съсредоточим върху две колони по-специално:DATA_LENGTH
и INDEX_LENGTH
.
DATA_LENGTH
е дължината (или размера) на всички данни в таблицата (вbytes
).INDEX_LENGTH
е дължината (или размерът) на индексния файл за таблицата (също вbytes
). ).
Въоръжени с тази информация, можем да изпълним заявка, която ще изброи всички таблици в конкретна база данни заедно с дисковото пространство (размер) на всяка. Можем дори да станем малко по-изискани и да преобразуваме стойностите на нормалния размер от bytes
в нещо по-полезно и разбираемо за повечето хора като 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;
В този пример с помощта на bookstore
база данни, ние комбинираме DATA_LENGTH
и INDEX_LENGTH
като bytes
, след което се разделя на 1024
два пъти за конвертиране в kilobytes
и след това megabytes
. Нашият набор от резултати ще изглежда така:
+----------------------------------+-----------+
| Table | Size (MB) |
+----------------------------------+-----------+
| book | 267 |
| author | 39 |
| post | 27 |
| cache | 24 |
...
Ако не ви пука за всички таблици в базата данни и искате само размера на конкретна таблица, можете просто да добавите AND TABLE_NAME = "your_table_name"
до WHERE
клауза. Тук искаме само информация за book
таблица:
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;
Резултатите, както се очакваше, сега са:
+-------+-----------+
| Table | Size (MB) |
+-------+-----------+
| book | 267 |
+-------+-----------+
1 row in set (0.00 sec)
Избройте всички размери на таблици от ВСИЧКИ бази данни
Ако се сблъскате с проблем, при който вашата база данни нараства по размер, но не знаете коя таблица е виновникът, може да е полезно да потърсите размера на всички таблици ввсички бази данни в цялата система. Това може да бъде постигнато лесно със следната заявка:
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;
Това ще върне не само размера на таблицата, но и името на таблицата и родителската база данни, с които е свързана.