znajduję , co jest najlepszym sposobem na oszacowanie wielkości stołu do tego Badałem wiele blogów i forów, ale nie można znaleźć żadnych dokładnych odpowiedzi
Na przykład mamy tabelę Miasto z silnikiem InnoDB , powiedzmy w przyszłości (za 1 rok), że będzie miała 1 milion rekordów, więc jaka będzie szacowana wielkość danych i rozmiar indeksu tej tabeli w tym okresie.
mysql> desc City;
+-------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------+------+-----+---------+----------------+
| ID | int(11) | NO | PRI | NULL | auto_increment |
| Name | char(35) | NO | | | |
| CountryCode | char(3) | NO | MUL | | |
| District | char(20) | NO | | | |
| Population | int(11) | NO | | 0 | |
+-------------+----------+------+-----+---------+----------------+
5 rows in set (0.03 sec)
AKTUALIZACJA
Jaka będzie szacowana górna granica (maksymalny rozmiar tabeli) z 1 milionem rekordów i jak możemy to oszacować.
Odpowiedzi:
Rozumiem, biorąc pod uwagę opis tabeli
W przypadku miliona wierszy byłoby to 77 000 000 bajtów (73,43 MB)
Jeśli chodzi o pomiar tabeli, dla danej tabeli mydb.mytable możesz uruchomić to zapytanie
Aby zmierzyć wszystkie tabele pogrupowane według silnika bazy danych i pamięci
Uruchom te zapytania, aby śledzić zmiany w użyciu dysku bazy danych / silnika.
Spróbuj !!!
źródło
CHAR
długości należy pomnożyć przez 3, jeśli maszCHARSET utf8
. Cały narzut można oszacować poprzez podwojenie lub potrojenie obliczeń.ALTER TABLE ... ENGINE=InnoDB;
), aby uzyskać dokładny współczynnik. Wysiłek może nie być tego wart.Jeśli używasz tabel InnoDB, możesz uzyskać rozmiar danych / poszczególnych indeksów z
mysql.innodb_index_stats
. Statystyka „size” zawiera odpowiedź na stronach, więc należy pomnożyć ją przez rozmiar strony, czyli domyślnie 16 KB .Indeks PODSTAWOWY to same dane.
źródło
przez wykonywanie kwerendy można uzyskać rozmiar używany
Data
iIndex
od stołu, można to sprawdzić rozmiar przed # wierszy i przewidywania na 1 milion wierszyźródło
Jeśli nie masz jeszcze danych, oto kilka wskazówek. Poniższe informacje dotyczą InnoDB. (MyISAM jest znacznie prostszy i mniejszy).
Nie używaj
CHAR
do kolumn o zmiennej długości. ZCHARACTER SET
czego korzystasz Ascii potrzebuje jednego bajtu na znak; utf8mb4 potrzebuje od 1 do 4.Łącznie = około 80 bajtów.
Pomnóż 80 przez 2 do 3, aby uwzględnić różne koszty ogólne. Najprawdopodobniej tabela wierszy 1M będzie zawierać się między 160 MB a 240 MB.
Aby zmierzyć pojedynczy indeks, powiedzmy
CountryCode
3 bajty:Uwagi:
Należy obliczyć tylko węzły liści (BTrees); koszty ogólne dla węzłów innych niż liście wynoszą zwykle 1%.
PRIMARY KEY
Jest „skupione” z danymi, więc nie ma potrzeby, aby ją obliczyć.Jeśli nie masz wyraźnego PK, musisz dodać 6 bajtów do rozmiaru wiersza, aby umożliwić sfabrykowane PK.
ROW_FORMAT = COMPRESSED
daje ci skurcz 2: 1. (To nie jest tak dobre jak typowy współczynnik kompresji zip (itp.) 3: 1.)SHOW TABLE STATUS LIKE "tablename";
to szybki sposób na obliczenie „rzeczywistego” rozmiaru. ZobaczData_length
dane i PK;Index_length
dla indeksów wtórnych iData_free
dla niektórych innych rzeczy.Jest rzadko
Index_length
przekraczaData_length
. Jednak nie jest to „złe”, aby tak się stało.źródło
To nużące. Ale szczegóły są w dokumentach .
Aby być możliwie najdokładniejszym, co rzadko jest konieczne, musisz także przeczytać o strukturze tabeli i strukturze indeksu.
Gdybym był w twoich butach, zbudowałbym tabelę, zapełniłem ją milionem wierszy danych testowych i zmierzyłem zmianę rozmiaru. W zależności od aplikacji może być konieczne uwzględnienie rozmiaru plików dziennika transakcji.
źródło