Jak uzyskać prawdziwy rozmiar bazy danych MySQL?

144

Chciałbym wiedzieć, ile miejsca zajmuje moja baza danych MySQL, aby wybrać hosta internetowego. Znalazłem polecenie, SHOW TABLE STATUS LIKE 'table_name'więc kiedy wykonuję zapytanie, otrzymuję coś takiego:

Name       | Rows | Avg. Row Length | Data_Length | Index Length
----------   ----   ---------------   -----------   ------------
table_name   400          55            362000        66560
  • liczby są zaokrąglane.

Czy mam 362000 lub 400 * 362000 = 144800000 bajtów danych dla tej tabeli? A co oznacza długość indeksu? Dzięki !

Marvin
źródło
masz 362000 + 66560. Długość_danych + Długość indeksu
mandza
Możliwy duplikat Jak uzyskać rozmiar bazy danych mysql?
Mohammad
Ta strona zawiera dokładną odpowiedź rathishkumar.in/2017/12/…
Rathish

Odpowiedzi:

281

Od S. Prakasha, znalezionego na forum MySQL :

SELECT table_schema "database name",
    sum( data_length + index_length ) / 1024 / 1024 "database size in MB",
    sum( data_free )/ 1024 / 1024 "free space in MB"
FROM information_schema.TABLES
GROUP BY table_schema; 

Lub w jednej linii dla łatwiejszego kopiowania i wklejania:

SELECT table_schema "database name", sum( data_length + index_length ) / 1024 / 1024 "database size in MB", sum( data_free )/ 1024 / 1024 "free space in MB" FROM information_schema.TABLES GROUP BY table_schema; 
ron_dobley
źródło
7
Co oznacza wolne miejsce w MB? Mam wolne 100 GB, ale zgłasza mniej niż 1 GB wolnego.
Barth
1
@Barth zgodnie z dokumentacją oznacza „wolne miejsce w bajtach na tabele InnoDB”. Niestety nie ma wyjaśnienia, co to oznacza: - \
ckujau
13
Wolne miejsce w bajtach oznacza właśnie to - oznacza to, że ilość miejsca można odzyskać, jeśli ZOPTYMALIZUJESZ tabelę lub odbudujesz ją od podstaw. Gdy bazy danych przechowują informacje na dyskach, alokują je w blokach; usunięcie rekordu często zwalnia blok między używanymi blokami, a przesuwanie wszystkich pozostałych bloków w celu wykorzystania tego miejsca w górę jest bardzo kosztowne, więc jest ono oznaczone jako „wolne”. Przestrzeń ta może zostać później wykorzystana przez sam silnik bazy danych lub może zostać odzyskana za pomocą OPTIMIZE TABLE foo(MyISAM) lub odtworzyć + analizę tabel InnoDB.
zrujnowany
92

Możesz uzyskać rozmiar bazy danych MySQL, uruchamiając następujące polecenie w kliencie MySQL

SELECT  sum(round(((data_length + index_length) / 1024 / 1024 / 1024), 2))  as "Size in GB"
FROM information_schema.TABLES
WHERE table_schema = "<database_name>"
minhas23
źródło
30

Jeśli używasz phpMyAdmina, może on przekazać ci te informacje.

Po prostu przejdź do „Bazy danych” (menu na górze) i kliknij „Włącz statystyki”.

Zobaczysz coś takiego:

Zrzut ekranu phpMyAdmin

Prawdopodobnie utraci to pewną dokładność wraz ze wzrostem rozmiarów, ale powinno być wystarczająco dokładne do twoich celów.

Radu Murzea
źródło
Obecnie używam 000webhost. Ma phpMyAdmina, ale nie mogłem znaleźć pola wyboru „włącz statystyki”. Czy jest (może) zapytanie o to?
marvin,
1
@marvin Cóż, możliwe, że webhost ma zainstalowaną starszą wersję phpMyAdmin. Nie wiem, w której wersji ta funkcja została wprowadzona.
Radu Murzea,
Na pasku bocznym kliknij ikonę Strona główna u góry, która przeniesie Cię do strony głównej. W prawym oknie kliknij „Bazy danych”. Wyświetla jednokolumnową tabelę baz danych, poniżej znajduje się łącze o nazwie „Włącz statystyki”
VeeK,
8

jeśli chcesz go znaleźć w MB, zrób to

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; 
jakson
źródło
Fragment kodu SQL tej odpowiedzi wydaje się być kopią stackoverflow.com/a/1733523/1200542
Ariel Allon
3

Zasadniczo istnieją dwa sposoby: wysłanie zapytania do bazy danych (długość danych + długość indeksu) lub sprawdzenie rozmiaru plików. Długość indeksu jest związana z danymi przechowywanymi w indeksach.

Wszystko jest opisane tutaj:

http://www.mkyong.com/mysql/how-to-calculate-the-mysql-database-size/

MiGro
źródło
Cóż, ta strona jest źródłem mojego pytania. Ale zgodnie z tym zapytaniem mam 0,5 MB, co sprawia, że ​​jestem całkiem bezpieczny. Mam nadzieję, że to prawda :) Dzięki!
marvin,
0

Żadna z odpowiedzi nie obejmuje rozmiaru narzutów i rozmiarów metadanych tabel.

Oto dokładniejsze oszacowanie „przestrzeni dyskowej” przydzielonej przez bazę danych.

SELECT ROUND((SUM(data_length+index_length+data_free) + (COUNT(*) * 300 * 1024))/1048576+150, 2) AS MegaBytes FROM information_schema.TABLES WHERE table_schema = 'DATABASE-NAME'
Semra
źródło
5
Czy mógłbyś to rozwinąć? Zwłaszcza twoje stałe 300i 150?
Melebius
Proszę, czy mógłbyś to rozwinąć?
Allan Andrade
0

SUM(Data_free) może, ale nie musi, być ważne . To zależy od historii innodb_file_per_table. Więcej dyskusji można znaleźć tutaj .

Rick James
źródło
0

Jeśli używasz MySql Workbench, bardzo łatwo jest uzyskać wszystkie szczegóły dotyczące rozmiaru bazy danych, rozmiaru każdej tabeli, rozmiaru indeksu itp.

  1. Kliknij prawym przyciskiem myszy Schemat
  2. Wybierz Schema Inspector opcję

    wprowadź opis obrazu tutaj

  3. Pokazuje wszystkie szczegóły rozmiaru schematu

  4. Wybierz kartę Tabele, aby zobaczyć rozmiar każdej tabeli.

    wprowadź opis obrazu tutaj

  5. Rozmiar tabeli wyświetlany w kolumnie Długość danych

Viraj Dhamal
źródło
0

Jeśli chcesz znaleźć rozmiar wszystkich baz danych MySQL, użyj tego polecenia, pokaże ich odpowiednie rozmiary w megabajtach;

SELECT table_schema "database", sum(data_length + index_length)/1024/1024 "size in MB" FROM information_schema.TABLES GROUP BY table_schema;

Jeśli masz duże bazy danych, możesz użyć następującego polecenia, aby wyświetlić wynik w gigabajtach;

SELECT table_schema "database", sum(data_length + index_length)/1024/1024/1024 "size in GB" FROM information_schema.TABLES GROUP BY table_schema;

Jeśli chcesz na przykład pokazać rozmiar tylko określonej bazy danych YOUR_DATABASE_NAME, możesz użyć następującego zapytania;

SELECT table_schema "database", sum(data_length + index_length)/1024/1024/1024 "size in GB" FROM information_schema.TABLES WHERE table_schema='YOUR_DATABASE_NAME' GROUP BY table_schema;
Arbab Nazar
źródło