Powinieneś spróbować wyświetlić kolumnę varchar tak samo, jak kolumnę char w większości scenariuszy i ostrożnie ustawić długość. Nie musisz zawsze myśleć o modyfikatorze var, ale o czymś, co wpływa na podejmowanie decyzji o maksymalnej długości. To naprawdę powinno być postrzegane jako wskazówka dotycząca wydajności zamiast tego, że dostarczone struny będą miały różną długość.
Nie jest to dyrektywa, której muszą ściśle przestrzegać wewnętrzne elementy bazy danych, można ją całkowicie zignorować. Uważaj jednak, ponieważ czasami implementacja może przeciekać (na przykład stała długość i wyściółka), nawet jeśli nie powinno to być w idealnym świecie.
Jeśli masz varchar (255), nie masz gwarancji, że pod względem wydajności zawsze będzie zachowywał się inaczej niż char (255) w każdych okolicznościach.
Może wydawać się łatwe ustawienie wartości, takiej jak 255, 65535 itd., Zgodnie z poradami zawartymi w podręczniku dotyczącymi wymagań dotyczących przechowywania. Daje to wrażenie, że każda wartość od 0 (tak, to jest rzecz) do 255 będzie miała taki sam wpływ. Jednak nie można tego w pełni zagwarantować.
Wymagania dotyczące przechowywania są zwykle prawdziwe lub dobrym wskaźnikiem dla przyzwoitych i dojrzałych silników pamięci trwałej pod względem przechowywania wierszy. Nie jest to tak silny wskaźnik dla rzeczy takich jak indeksy.
Czasami jest to trudne pytanie, jak długo powinien być kawałek sznurka, więc ustawiając go na najwyższą granicę, wiesz, że powinien znajdować się w środku, ale to nie ma wpływu. Niestety, często jest to coś, co użytkownik musi rozwiązać i jest to naprawdę nieco arbitralne. Naprawdę nie można powiedzieć, że nigdy nie przesadzono z sznurkiem, ponieważ mogą być przypadki, w których nie jesteś do końca pewien.
Powinieneś upewnić się, że zapytania MySQL generują błąd, gdy łańcuch jest zbyt długi, a nie jest obcięty, abyś przynajmniej wiedział, czy może być za krótki z powodu emisji błędów. Zmiana rozmiaru kolumn w celu ich powiększenia lub zmniejszenia może być kosztowną operacją DDL, należy o tym pamiętać.
Zestaw znaków należy również wziąć pod uwagę, gdy w grę wchodzi długość i wydajność. Długość odnosi się do tego, a nie do bajtów. Jeśli na przykład używasz utf8 (nie MB4), to varchar (255) jest naprawdę varbinary (3 * 255). Trudno jest wiedzieć, jak naprawdę potoczą się takie rzeczy bez uruchamiania testów i wnikania w kod źródłowy / dokumentację. Z tego powodu nadmierna długość może mieć nieoczekiwanie zawyżony wpływ. dotyczy to nie tylko wydajności. Jeśli pewnego dnia będziesz musiał zmienić zestaw znaków kolumny varchar na większy, możesz skończyć z osiągnięciem jakiegoś limitu bez możliwości regresu, jeśli pozwolisz na występowanie nieuzasadnionych długich ciągów, których można było uniknąć. Zwykle jest to dość niszowy problem, ale pojawia się,
Jeśli okaże się, że MAX (LENGTH (kolumna)) jest zawsze <64 (na przykład, jeśli zdecydowano, że będzie ograniczenie wejściowe, które nie jest zgodne z definicją kolumny), ale masz varchar (255), to istnieje duża szansa, że w niektórych scenariuszach zużyjesz cztery razy więcej miejsca niż potrzeba.
Może to obejmować:
- Różne silniki, niektórzy mogą to całkowicie ignorować.
- Rozmiary buforów, na przykład aktualizacja lub wstawianie, mogą wymagać przydzielenia pełnych 255 (chociaż nie sprawdziłem kodu źródłowego, aby to udowodnić, jest to tylko hipotetyczne).
- Indeksy, będzie to od razu oczywiste, jeśli spróbujesz utworzyć klucz złożony z wielu kolumn varchar (255).
- Tabele pośrednie i ewentualnie zestawy wyników. Biorąc pod uwagę sposób działania transakcji, nie zawsze może być możliwe użycie rzeczywistej maksymalnej długości ciągów w kolumnie w przeciwieństwie do zdefiniowanego limitu.
- Wewnętrzne optymalizacje predykcyjne mogą przyjmować maksymalną długość jako dane wejściowe.
- Zmiany w wersjach implementacji baz danych.
Z reguły nie ma potrzeby, aby varchar był dłuższy niż powinien, problemy z wydajnością lub nie, więc radzę trzymać się tego, kiedy możesz. Podjęcie większego wysiłku w celu sprawdzenia rozmiaru danych, narzucenia prawdziwego limitu lub znalezienia prawdziwego limitu poprzez zapytanie / badanie jest idealnym podejściem.
Jeśli nie możesz, jeśli chcesz zrobić coś takiego jak varchar (255) w przypadkach, gdy masz wątpliwości, polecam zrobienie nauki. Może to polegać na powieleniu tabeli, zmniejszeniu rozmiaru kolumny var char, a następnie skopiowaniu do niej danych z oryginału i sprawdzeniu rozmiaru danych indeksu / wierszy (indeksuj również kolumnę, spróbuj również jako klucza podstawowego, który może zachowywać się inaczej w InnoDB, ponieważ wiersze są uporządkowane według klucza podstawowego). W ten sposób przynajmniej dowiesz się, czy masz wpływ na IO, co jest jednym z najbardziej wrażliwych wąskich gardeł. Testowanie zużycia pamięci jest trudniejsze, ciężko jest to wyczerpująco przetestować. Poleciłbym przetestowanie potencjalnych najgorszych przypadków (zapytania z wieloma pośrednimi wynikami w pamięci, sprawdź z wyjaśnieniem dla dużych tabel tymczasowych itp.).
Jeśli wiesz, że w tabeli nie będzie wielu wierszy, nie będziesz używać kolumny do łączenia, indeksów (szczególnie złożonych, unikalnych) itp., To najprawdopodobniej nie będziesz mieć wielu problemów.
VARCHAR(255) utf8mb4
kolumną z ~ 150 tys. Wierszy o wielkości 11,5 MB. Tabela zVARCHAR(48) utf8mb4
indeksowaną kolumną z tymi samymi danymi (maksymalna długość 46 znaków) wykorzystywała 4,5 MB. Nie jest to duża różnica w zapytaniach, jest indeksowana. Ale sumuje się z zapytaniami we / wy i takimi rzeczami, jak kopie zapasowe baz danych.