2009-07-20 6 views
54

W jaki sposób MySQL przechowuje pole varchar? Można przypuszczać, że następujący wzór stanowi rozsądne wymiary przechowywania:Jakie są optymalne rozmiary varchar dla MySQL?

1,2,4,8,16,32,64,128,255 (max)

wyjaśnienie poprzez np. Powiedzmy, że mam pole varchar złożone z 20 znaków. Czy MySQL podczas tworzenia tego pola, w zasadzie rezerwuje miejsce na 32 bajty (nie jest pewne, czy są to bajty czy nie), ale pozwala tylko na wprowadzenie 20?

Zgaduję, że martwię się o optymalizację miejsca na dysku na ogromny stół.

+7

Chciałem zauważyć, że od wersji varchar MySQL 5.0.3 może być w górę 65 535 – joshtronic

Odpowiedz

46

Aby odpowiedzieć na pytanie, na dysku MySql używa 1 + rozmiaru, który jest używany w polu do przechowywania danych (więc jeśli kolumna została zadeklarowana jako varchar (45), a pole było "FooBar", to użyłoby 7 bajtów na dysku, chyba że używasz zestawu znaków wielobajtowych, w którym byłoby 14 bajtów). Tak więc, mimo że zadeklarujesz kolumny, nie będzie to miało wpływu na koniec przechowywania (stwierdziłeś, że martwisz się optymalizacją dysku dla ogromnego stołu). Jednak robi to różnicę w zapytaniach, ponieważ VARCHAR są konwertowane na CHAR, gdy MySql tworzy tabelę tymczasową (SORT, ORDER, itp.) I im więcej rekordów można zmieścić na jednej stronie, tym mniej pamięci i szybszych skanów tabeli będzie być.

+0

hm? więc w wielobajtowym zestawie znaków jest ((rozmiar) + 2)? – andyk

+3

Nie, w wielobajtowym jest (rozmiar * 2) + 1. –

+2

@Kris: Wierzę, że może to być również (rozmiar * 3) + 1 lub nawet (rozmiar * 4) + 1, nie? –

22

MySQL przechowuje pole varchar jako rekord o zmiennej długości, z przedrostkiem jedno- lub dwubajtowym w celu wskazania rozmiaru rekordu.

Posiadanie wzorca rozmiarów pamięci nie ma większego wpływu na to, jak MySQL będzie działał w przypadku przechowywania rekordów o zmiennej długości. Długość określona w deklaracji varchar (x) po prostu określi maksymalną długość danych, które można przechowywać. Zasadniczo varchar (16) nie różni się pod względem dyskowym od varchara (128).

This manual page ma bardziej szczegółowe wyjaśnienie.

Edycja: Jeśli chodzi o zaktualizowane pytanie, odpowiedź jest wciąż taka sama. Pole varchar będzie zużywać tylko tyle miejsca na dysku, ile danych w nim przechowywanych (plus jeden lub dwa bajty narzutowe). Więc nie ma znaczenia, czy masz varchar (16) lub varchar (128), jeśli przechowujesz w nim 10-znakowy ciąg, użyjesz tylko 10 bajtów (plus 1 lub 2) miejsca na dysku .

+30

Właściwy dostęp to robi ogromną różnicę, ponieważ kiedy MySql tworzy zestaw wyników w pamięci, przekształca go w macierz, więc jeśli Największe pole ma 16 znaków, ale pole jest zdefiniowane jako 128 znaków, które musisz przydzielić dodatkowe 112 znaków dla każdego wiersza. To marnuje dużo pamięci. –

+2

Nie tylko musisz przydzielić dodatkowe 112 znaków dla każdego wiersza w pamięci, ale będziesz miał znacznie więcej pamięci podręcznej L1 pomijane, gdy każdy wiersz jest powtarzany. Jest to porównywane z typem kolumny VARCHAR (16), w którym można wycisnąć o wiele więcej wierszy z tą kolumną w szybki bufor podręczny pod maską. –