Mogę uruchomić to zapytanie, aby uzyskać rozmiary wszystkich tabel w bazie danych MySQL:
show table status from myDatabaseName;
Chciałbym pomóc w zrozumieniu wyników. Szukam stołów o największych rozmiarach.
Na którą kolumnę powinienem spojrzeć?
Mogę uruchomić to zapytanie, aby uzyskać rozmiary wszystkich tabel w bazie danych MySQL:
show table status from myDatabaseName;
Chciałbym pomóc w zrozumieniu wyników. Szukam stołów o największych rozmiarach.
Na którą kolumnę powinienem spojrzeć?
Odpowiedzi:
Możesz użyć tego zapytania, aby pokazać rozmiar tabeli (chociaż najpierw musisz podstawić zmienne):
SELECT
table_name AS `Table`,
round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB`
FROM information_schema.TABLES
WHERE table_schema = "$DB_NAME"
AND table_name = "$TABLE_NAME";
lub to zapytanie, aby wyświetlić rozmiar każdej tabeli w każdej bazie danych, najpierw największe:
SELECT
table_schema as `Database`,
table_name AS `Table`,
round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB`
FROM information_schema.TABLES
ORDER BY (data_length + index_length) DESC;
AND table_name IN ('table_1', 'table_2', 'table_3');
VARCHARi BLOBpiszesz?
SELECT TABLE_NAME AS "Table Name",
table_rows AS "Quant of Rows", ROUND( (
data_length + index_length
) /1024, 2 ) AS "Total Size Kb"
FROM information_schema.TABLES
WHERE information_schema.TABLES.table_schema = 'YOUR SCHEMA NAME/DATABASE NAME HERE'
LIMIT 0 , 30
Można uzyskać nazwę schematu z „ information_schema ” -> Schematy stół -> „ schema_name ” kolumna
Dodatkowe Możesz uzyskać rozmiar baz danych mysql w następujący sposób.
SELECT table_schema "DB Name",
Round(Sum(data_length + index_length) / 1024 / 1024, 1) "DB Size in MB"
FROM information_schema.tables
GROUP BY table_schema;
Wynik
DB Name | DB Size in MB
mydatabase_wrdp 39.1
information_schema 0.0
Jeśli chcesz, aby zapytanie korzystało z aktualnie wybranej bazy danych. po prostu skopiuj wklej to zapytanie. (Nie wymaga modyfikacji)
SELECT table_name ,
round(((data_length + index_length) / 1024 / 1024), 2) as SIZE_MB
FROM information_schema.TABLES
WHERE table_schema = DATABASE() ORDER BY SIZE_MB DESC;
SIZE_MBZ schematu_informacyjnego.TABLES GDZIE tabela_schema = BAZA DANYCH () ORDER BY (długość_danych + długość_indeksu) ASC;
Istnieje łatwy sposób na uzyskanie wielu informacji za pomocą Workbench:
Kliknij prawym przyciskiem myszy nazwę schematu i kliknij „Inspektor schematu”.
W wyświetlonym oknie masz wiele zakładek. Pierwsza zakładka „Informacje” pokazuje przybliżone oszacowanie wielkości bazy danych w MB.
Druga zakładka „Tabele” pokazuje Długość danych i inne szczegóły dla każdej tabeli.
Rozmiar wszystkich tabel:
Załóżmy, że twoja baza danych lub TABLE_SCHEMAnazwa to „news_alert”. Następnie to zapytanie pokaże rozmiar wszystkich tabel w bazie danych.
SELECT
TABLE_NAME AS `Table`,
ROUND(((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024),2) AS `Size (MB)`
FROM
information_schema.TABLES
WHERE
TABLE_SCHEMA = "news_alert"
ORDER BY
(DATA_LENGTH + INDEX_LENGTH)
DESC;
Wynik:
+---------+-----------+
| Table | Size (MB) |
+---------+-----------+
| news | 0.08 |
| keyword | 0.02 |
+---------+-----------+
2 rows in set (0.00 sec)Dla konkretnej tabeli:
Załóżmy, że twoje TABLE_NAMEsą „wiadomościami” . Następnie zapytanie SQL będzie-
SELECT
TABLE_NAME AS `Table`,
ROUND(((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024),2) AS `Size (MB)`
FROM
information_schema.TABLES
WHERE
TABLE_SCHEMA = "news_alert"
AND
TABLE_NAME = "news"
ORDER BY
(DATA_LENGTH + INDEX_LENGTH)
DESC;
Wynik:
+-------+-----------+
| Table | Size (MB) |
+-------+-----------+
| news | 0.08 |
+-------+-----------+
1 row in set (0.00 sec)Spróbuj wykonać następujące polecenie powłoki (zastąp DB_NAMEnazwą bazy danych):
mysql -uroot <<<"SELECT table_name AS 'Tables', round(((data_length + index_length) / 1024 / 1024), 2) 'Size in MB' FROM information_schema.TABLES WHERE table_schema = \"DB_NAME\" ORDER BY (data_length + index_length) DESC;" | head
W przypadku rozwiązania Drupal / drush sprawdź następujący przykładowy skrypt, który wyświetli największe używane tabele:
#!/bin/sh
DB_NAME=$(drush status --fields=db-name --field-labels=0 | tr -d '\r\n ')
drush sqlq "SELECT table_name AS 'Tables', round(((data_length + index_length) / 1024 / 1024), 2) 'Size in MB' FROM information_schema.TABLES WHERE table_schema = \"${DB_NAME}\" ORDER BY (data_length + index_length) DESC;" | head -n20
Oto inny sposób rozwiązania tego problemu przy użyciu wiersza polecenia bash.
for i in mysql -NB -e 'show databases'; do echo $i; mysql -e "SELECT table_name AS 'Tables', round(((data_length+index_length)/1024/1024),2) 'Size in MB' FROM information_schema.TABLES WHERE table_schema =\"$i\" ORDER BY (data_length + index_length) DESC" ; done
Zaadaptowano z odpowiedzi ChapMic, aby zaspokoić moją szczególną potrzebę.
Podaj tylko nazwę bazy danych, a następnie posortuj wszystkie tabele w kolejności malejącej - od NAJWIĘKSZEJ do NAJMNIEJSZEJ tabeli w wybranej bazie danych. Wymaga tylko 1 zmiennej do zastąpienia = nazwa bazy danych.
SELECT
table_name AS `Table`,
round(((data_length + index_length) / 1024 / 1024), 2) AS `size`
FROM information_schema.TABLES
WHERE table_schema = "YOUR_DATABASE_NAME_HERE"
ORDER BY size DESC;
Jeśli masz sshdostęp, możesz po prostu spróbować du -hc /var/lib/mysql(lub inaczej datadir, zgodnie z ustawieniem w swoim my.cnf).
Kolejny sposób pokazania liczby wierszy i zajmowanej przestrzeni i uporządkowania według niej.
SELECT
table_schema as `Database`,
table_name AS `Table`,
table_rows AS "Quant of Rows",
round(((data_length + index_length) / 1024 / 1024/ 1024), 2) `Size in GB`
FROM information_schema.TABLES
WHERE table_schema = 'yourDatabaseName'
ORDER BY (data_length + index_length) DESC;
Jedynym ciągiem, który musisz zastąpić w tym zapytaniu, jest „twoja NazwaDanych”.
Uważam, że istniejące odpowiedzi w rzeczywistości nie podają wielkości tabel na dysku, co jest bardziej pomocne. To zapytanie zapewnia dokładniejsze oszacowanie dysku w porównaniu do rozmiaru tabeli na podstawie długości danych i indeksu. Musiałem użyć tego do wystąpienia AWS RDS, w którym nie można fizycznie zbadać dysku i sprawdzić rozmiarów plików.
select NAME as TABLENAME,FILE_SIZE/(1024*1024*1024) as ACTUAL_FILE_SIZE_GB
, round(((data_length + index_length) / 1024 / 1024/1024), 2) as REPORTED_TABLE_SIZE_GB
from INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES s
join INFORMATION_SCHEMA.TABLES t
on NAME = Concat(table_schema,'/',table_name)
order by FILE_SIZE desc
Oblicz całkowity rozmiar bazy danych na końcu:
(SELECT
table_name AS `Table`,
round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB`
FROM information_schema.TABLES
WHERE table_schema = "$DB_NAME"
)
UNION ALL
(SELECT
'TOTAL:',
SUM(round(((data_length + index_length) / 1024 / 1024), 2) )
FROM information_schema.TABLES
WHERE table_schema = "$DB_NAME"
)
SELECT TABLE_NAME AS table_name,
table_rows AS QuantofRows,
ROUND((data_length + index_length) /1024, 2 ) AS total_size_kb
FROM information_schema.TABLES
WHERE information_schema.TABLES.table_schema = 'db'
ORDER BY (data_length + index_length) DESC;
wszystkie 2 powyżej są testowane na mysql
Powinno to zostać przetestowane w mysql, a nie postgresql:
SELECT table_schema, # "DB Name",
Round(Sum(data_length + index_length) / 1024 / 1024, 1) # "DB Size in MB"
FROM information_schema.tables
GROUP BY table_schema;