Problem:
Czy istnieje jakiś sposób obliczenia liczby bajtów zajmowanych przez tworzenie tabeli, wiem, że możesz uzyskać pewne informacje z information_schema.tables, ale ta informacja nie jest wystarczająco dokładna.
Faktycznie wymagana jest liczba bajtów zgodnie z definicją tabeli tylko dla innodb, a sortowanie można również uznać za utf-8-general-ci
Na przykład test tabeli wygląda następująco
utworzyć test tabeli
(
col1 varchar (25),
col2 int,
col3 varchar (3),
col4 char (15),
col5 datetime
);
Teraz wymagałaby znajomości całkowitego rozmiaru wiersza, który można akumulować w jednym rzędzie zgodnie z typami kolumn w tabeli.
Znalazłem podobne rozwiązanie w MSSQL, ale potrzebuję jego wersji MySQL
Skrypt do oszacowania rozmiarów wierszy dla dowolnej tabeli
Każda pomoc jest mile widziana.
źródło
Odpowiedzi:
Po wielu myślach i badaniach znalazłem jedną odpowiedź, która naprawdę pomogła w osiągnięciu tego, co było wymagane. Jest to skrypt perla, a odnośnikiem jest
http://dev.mysql.com/doc/refman/5.6/en/storage-requirements.html
Dziękuję wszystkim za wspaniałą pomoc.
źródło
-uUser -pPass
do wiersza poleceń mysql i mysqldump w skrypcie (lub spróbuj--defaults-extra-file=/etc/mysql/debian.cnf
zamiast tego na Ubuntu / Debian) i uruchom go z bazą danych jako pierwszy argument, jakperl test.pl mydatabase
Musisz znać rozmiar w bajtach każdego pola zgodnie z typem danych ( tutaj odwołanie do MySQL ), a następnie zsumować te wartości razem.
źródło
Krok 1:
20 znaków angielskich: 2 + 1 * 20
20 znaków środkowo-wschodnich / słowiańskich: 2 + 2 * 20
20 znaków azjatyckich: 2 + 3 * 20
20 znaków emoji: 2 + 4 * 20 (i potrzebujesz
utf8mb4
)Krok 2: Dodaj je.
Krok 3: Pomnóż przez około 2 do 3, aby pozwolić na obciążenie InnoDB. Przekonałem się, że ten czynnik zwykle działa. (Ale nie dla małych tabel i niekoniecznie dobrze dla tabel podzielonych na partycje).
Nie widzę powodu, by przyjmować maksymalny rozmiar każdej kolumny.
Możesz zbliżyć się
SHOW TABLE STATUS
lubinformation_schema
dane równoważne :Krok 1:
SELECT COUNT(*)
- nam to zamiastRows
Krok 2: Zdobądź
Data_length + Index_length + Data_free
Krok 3: Podziel.
źródło
SELECT AVG(LENGTH(varchar_col))
- Uwaga:LENGTH
jest już bajtami ; nie ma potrzeby mnożenia przez 2/3/4. (CHAR_LENGTH
pobiera długość w postaciach).Zrobiłem szorstki skrypt bash, aby obliczyć rozmiar wiersza i ostrzec, jeśli przekroczy limit oparty na schemacie:
W pobliżu
źródło
Jest już kilka pytań tego typu, na przykład jedno: Jak oszacować / przewidzieć rozmiar danych i rozmiar indeksu tabeli w MySQL
Jedną różnicą między tym pytaniem a tabelą jest obecność ciągów o zmiennej długości w twoim - pamiętaj, aby uwzględnić maksymalny rozmiar, jaki mogą być.
Pamiętaj również, że od wersji 5, która
varchar(25)
ma do 25 znaków, a nie do 25 bajtów, więc jeśli w ciągach znaków można zobaczyć znaki inne niż ASCII, rozmiar kolumny może się zwiększyć do maksymalnie 100 bajtów, ponieważ niektóre znaki zajmują cztery bajty reprezentować - na przykład „stos emoji poo” (który, nie jestem, nie istnieje) - jeśli twoja przeglądarka + obsługa czcionek wygląda tak: it) to 0xF0 0x9F 0x92 0xA9. Przed wersją v5 mySQL zliczał bajty, a nie znaki podczas określania długości typu łańcucha.Edytuj w zakresie automatyzacji
Jeśli chodzi o automatyzację procesu, powinieneś być w stanie uzyskać wszystkie potrzebne informacje z
INFORMATION_SCHEMA
tabel w sposób podobny do skryptu znalezionego dla MS SQL Server. Zobacz https://dev.mysql.com/doc/refman/5.0/en/information-schema.html, aby uzyskać dokumentację na ten temat.źródło
INFORMATION_SCHEMA
tabele powinny zawierać informacje potrzebne. Zobacz dev.mysql.com/doc/refman/5.0/en/information-schema.html, aby uzyskać dokumentację na ten temat.