Jak uzyskać rozmiary tabel bazy danych MySQL?

900

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ć?

JPashs
źródło
8
Co rozumiesz przez rozmiar? Liczba rzędów? Bajty pobrane na dysk?
Mark Byers,
@Zaznaczyć Chcę rozmiar na dysku to dobra metoda? # du -sh /mnt/mysql_data/openx/f_scraper_banner_details.MYI 79G /mnt/mysql_data/openx/f_scraper_banner_details.MYI
Ashish Karpe
3
Powiązane, jeśli jest to interesujące, w tej odpowiedzi napisałem Opisz wszystkie tabele .
Drew

Odpowiedzi:

1957

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;
ChapMic
źródło
3
Dziękuję, działa dobrze, ale nie jestem pewien, czy bierze pod uwagę Blobs.
David
5
Uwaga: można również użyć „IN”, aby określić wiele tabel, np.AND table_name IN ('table_1', 'table_2', 'table_3');
David Thomas
6
AFAICT, będzie to poprawnie liczyć tylko długości pól wielkości statycznej. Jak policzysz VARCHARi BLOBpiszesz?
l0b0
3
@kasimir W pewnym momencie świat stał się zagmatwany, a niektóre organizacje zajmujące się standardami i producenci sprzętu zdecydowali, że lepiej jest zdefiniować kilobajt w systemie dziesiętnym. Standard IEC nazywa teraz podstawowy 2 kilobajt (1024 bajty) kibibajtem (KiB). W każdym razie MySQL nie wie, więc jeśli chcesz kilobajtów dziesiętnych IEC, podziel przez 1000.
russellpierce
9
Czy to zadziała w przypadku silnika pamięci InnoDB? Zgodnie z dokumentacją mysql tutaj - dev.mysql.com/doc/refman/5.7/en/show-table-status.html , pole data_length dla tego silnika zawiera rozmiar indeksu klastrowego. To nie będzie poprawnie reprezentować rozmiaru danych. Czy to będzie?
euphoria83
96
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

Możesz uzyskać dodatkowe informacje tutaj.

Sumith Harshan
źródło
41
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"  
ORDER BY size DESC; 

To sortuje rozmiary (rozmiar DB w MB).

Gank
źródło
31

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;
zainengineer
źródło
5
Lub jeszcze krótszy (bez podkwerendy): WYBIERZ nazwę_tabeli, okrągły (((data_długość + długość_indeksu) / 1024/1024), 2) SIZE_MBZ schematu_informacyjnego.TABLES GDZIE tabela_schema = BAZA DANYCH () ORDER BY (długość_danych + długość_indeksu) ASC;
Onkeltem
15

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.

Gupik
źródło
Nie miałem zakładki „informacje” na moim komputerze Mac w wersji 6.0.9
Neil
Świetny!!! W MySQL Workbench istnieje także „Inspektor tabel” dla każdej tabeli. Nie odpowiednio szybko, ale bardzo przydatny!
T30
11
  • 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_NAME„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)
Nurul Akter Towhid
źródło
8

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
kenorb
źródło
6

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

użytkownik1380599
źródło
6

Jeśli używasz phpmyadmin, po prostu przejdź do struktury tabeli

na przykład

Space usage
Data    1.5 MiB
Index   0   B
Total   1.5 Mi
Almis
źródło
4

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;
dev101
źródło
3

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).

exic
źródło
Wreszcie odpowiedź, która nie zależy od schematu_informacyjnego. W moim przypadku zgłoszono 660 MB, podczas gdy rzeczywisty rozmiar w systemie plików wynosi 1,8 GB
php_nub_qq
2

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”.

Nav
źródło
2

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
Ryum Aayur
źródło
1

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"
)
MINGSONG HU
źródło
1
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

William
źródło
1

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; 
William
źródło
Chociaż może to odpowiedzieć na pytanie autora, brakuje w nim niektórych wyjaśnień i / lub linków do dokumentacji. Fragmenty surowego kodu nie są bardzo pomocne bez niektórych fraz wokół nich. Bardzo pomocne może się okazać, jak napisać dobrą odpowiedź . Edytuj swoją odpowiedź - Z recenzji
Nick
@Nick, dlaczego nadal jest zbanowany?
William
Przepraszam, nie znam odpowiedzi na to pytanie - nie jestem moderatorem.
Nick