Jestem w trakcie tworzenia stołu i zastanawiałem się.
Jeśli przechowuję, powiedzmy, samochody, które mają markę (np. BMW, Audi itp.), Czy zapiszę markę jako int lub varchar, wpłynie to na szybkość zapytania.
Więc jest
SELECT * FROM table WHERE make = 5 AND ...;
Szybciej / wolniej niż
SELECT * FROM table WHERE make = 'audi' AND ...;
czy prędkość będzie mniej więcej taka sama?
sql
performance
postgresql
select
googletorp
źródło
źródło
Niektóre przybliżone testy porównawcze:
4 miliony rekordów w Postgres 9.x
Wyniki na laptopie 8 GB RAM, i7, SSD:
więc wygląda na to, że w tej konfiguracji, o ile twoje indeksy mieszczą się w pamięci RAM, tekst bigint vs 16-znakowy nie ma znaczenia w szybkości.
źródło
Będzie trochę szybciej używając int zamiast varchar. Ważniejsze dla szybkości jest posiadanie indeksu w polu, którego kwerenda może użyć do znalezienia rekordów.
Jest jeszcze jeden powód, dla którego warto używać int, a jest nim normalizacja bazy danych. Zamiast przechowywać tekst „Mercedes-Benz” tysiące razy w tabeli, należy przechowywać jego identyfikator i raz przechowywać nazwę marki w osobnej tabeli.
źródło
Mercedes-Benz
przechowywać tysiące razy identyfikator1
. Na przykład tabelacar_brands
, kolumnyBrands
iId
. RządMercedes-Benz
i1
. A w głównej kolumnie tabeliBrands
i wartości1
. A kiedySELECT
, to najpierw wstańId
od stołu,car_brands
a potemSELECT Something FROM main_table WHERE Brands = (SELECT Id FROM car_brands WHERE Brands = Mercedes-Benz)
. Albo inne podejście?select something from main_table c inner join car_brands b on b.Id = c.Brands where b.Brands = 'Mercedes-Benz'
.Rozbijając się na rzeczywistą wydajność porównywania ciągów w porównaniu z wartościami zmiennoprzecinkowymi, w tym przypadku dowolny rozmiar bez znaku i ze znakiem nie ma znaczenia. Rozmiar jest właściwie prawdziwą różnicą w wydajności. Czy to 1 bajt + (do 126 bajtów), czy porównanie 1, 2, 4 lub 8 bajtów ... oczywiście nie-zmiennoprzecinkowe są mniejsze niż łańcuchy i zmiennoprzecinkowe, a zatem są bardziej przyjazne dla procesora w montażu.
Porównanie ciągów znaków we wszystkich językach jest wolniejsze niż coś, co może zostać porównane w jednej instrukcji przez procesor. Nawet porównanie 8 bajtów (64 bity) na 32-bitowym procesorze jest nadal szybsze niż VARCHAR (2) lub większe. * Ponownie, spójrz na utworzony zestaw (nawet ręcznie), aby porównać znaki po znaku, potrzeba więcej instrukcji niż numeryczny procesor CPU o wielkości od 1 do 8 bajtów.
O ile szybciej? zależy również od ilości danych. Jeśli po prostu porównujesz 5 do „audi” - i to wszystko, co ma twój DB, wynikowa różnica jest tak minimalna, że nigdy byś jej nie zauważył. W zależności od procesora, implementacji (klient / serwer, sieć / skrypt itp.) Prawdopodobnie nie zobaczysz tego, dopóki nie trafisz kilkuset porównań na serwerze DB (może nawet kilka tysięcy porównań, zanim będzie to zauważalne).
Ozz
źródło
Indeksuj czy nie, int jest dużo szybsze (im dłuższy varchar, tym wolniej).
Kolejny powód: indeks na polu varchar będzie znacznie większy niż na int. W przypadku większych tabel może to oznaczać setki megabajtów (i tysiące stron). To znacznie pogarsza wydajność, ponieważ odczyt samego indeksu wymaga wielu odczytów dysku.
źródło
Ogólnie int będzie szybszy. Im dłuższy jest varchar, tym wolniej się robi
źródło
Wskazówka: Jeśli możliwe wartości dla pola marki będzie nigdy (lub rzadko) zmiany, można użyć ENUM jako kompromis. Łączy dobrą szybkość z dobrą czytelnością.
źródło
enum
typ danych? Myślałem, że jest to specyficzne dla MySQL.Jeśli włączysz indeksowanie któregokolwiek z pól, będzie to szybsze. Jeśli chodzi o twoje pytanie, myślę, że
int
jest szybsze niżvarchar
.źródło
Nieco względne. Tak, INT będą szybsze, ale pytanie brzmi, czy jest to zauważalne w Twojej sytuacji. Czy VARCHAR to tylko małe słowa czy dłuższe teksty? a ile wierszy jest w tabeli? Jeśli jest tylko kilka wierszy, najprawdopodobniej będzie on całkowicie buforowany w pamięci (gdy jest często żądany), w takim przypadku nie zauważysz dużej różnicy. Oczywiście jest też indeksowanie, które staje się ważniejsze, gdy tabela rośnie. Korzystanie z dysków SSD może być szybsze niż dysków HD ze zoptymalizowanymi zapytaniami. Dobre kontrolery dysków czasami przyspieszają zapytania> 10x. Może to zostawić miejsce na zwykłe używanie VARCHAR, co ułatwia czytanie i pisanie zapytań (nie ma potrzeby pisania złożonych złączeń) i przyspiesza rozwój. Puryści jednak się nie zgodzą i zawsze wszystko znormalizują.
źródło