To zależy od twojego silnika. Powszechnie wiadomo, że odczyty są tanie, kilka bajtów tutaj i nie wpłynie to znacząco na wydajność bazy danych od małych do średnich.
Co ważniejsze, zależy to od zastosowań, do których wkładasz klucz podstawowy. Serie całkowite mają tę zaletę, że są proste w użyciu i implementacji. Zaletą jest to, że w zależności od konkretnej implementacji metody serializacji mają tę zaletę, że można je szybko uzyskać , ponieważ większość baz danych przechowuje tylko numer seryjny w stałej lokalizacji, zamiast uzyskiwać go Select max(ID)+1 from foo
w locie.
Powstaje pytanie: w jaki sposób 5-znakowy klucz stanowi „znaczącą wartość” dla Ciebie i dla aplikacji? Jak tworzona jest ta wartość i czy zajmuje to mniej więcej czasu niż znalezienie rosnącego numeru seryjnego. Podczas gdy w niektórych liczbach całkowitych jest oszczędna ilość miejsca, zdecydowana większość systemów zignoruje tę oszczędność miejsca.
Nie ma to wpływu na wydajność, z wyjątkiem tego, że schemat postaci wymaga, aby nigdy nie istniał automatyczny silnik, ponieważ „klucze” są niewystarczające. W przypadku konkretnej domeny nie zawracaj sobie głowy sztucznymi kluczami i po prostu używaj chińskich, japońskich i tajskich nazw kluczy. Chociaż nie możesz zagwarantować wyjątkowości w stosunku do jakiejkolwiek możliwej aplikacji, w twoim zakresie rozsądniej jest używać ich zamiast okropnych i wymuszonych skrótów 5-znakowych. Dopóki nie dojdziesz do milionów krotek, nie ma to znaczącego wpływu na wydajność.
Alternatywnie, jeśli śledzisz tylko według kraju pochodzenia, a nie konkretnej kuchni regionalnej (kantońskiej, Syczuańskiej, Sycylijskiej, Umbryjskiej, Kalabryjskiej, Jukatekańskiej, Oaxacan itp.), Zawsze możesz po prostu użyć kodów ISO 3166 .
Jeśli mam 10 000 przepisów, czy różnica między kluczem 5 i 20 znaków nie zaczyna się sumować?
Przestrzeń jest tania . Być może, kiedy mówisz o 10 000 000 przepisów, na których wykonujesz operacje OLAP. Przy 10 000 przepisach patrzysz na 150 000 miejsca.
Ale znowu to zależy. Jeśli masz wiele milionów rekordów i łączysz się z nimi, wówczas sensowne jest denormalizowanie wyszukiwania czegoś tak trywialnego (w zmaterializowanym widoku). We wszystkich praktycznych celach względna wydajność łączenia na nowoczesnej maszynie między kluczem 5-znakowym a kluczem o zmiennej długości jest tak podobna, że jest identyczna. Na szczęście żyjemy w świecie obfitości procesora i dysku. Te nieprzyjemne to zbyt wiele połączeń i nieefektywność zapytań, a nie porównywanie znaków po znaku. Powiedziawszy to, zawsze testuj .
Rzeczy P&T na tym poziomie są tak zależne od bazy danych, że uogólnienia są niezwykle trudne. Zbuduj dwa przykładowe modele bazy danych, wypełnij je szacunkową liczbą rekordów, a następnie sprawdź, który z nich jest szybszy. Z mojego doświadczenia wynika, że długość postaci nie robi dużej różnicy w porównaniu z dobrymi indeksami, dobrymi konfiguracjami pamięci i innymi krytycznymi elementami dostrajania wydajności.
Myślę, że nie ma problemu z wydajnością rzadko zmienianej tabeli. Być może będziesz mieć problemy z projektowaniem w przyszłości. Sugeruję, aby nie używać danych biznesowych jako klucza podstawowego z powodu zmian biznesowych. Użyj dowolnego dodatkowego klucza podstawowego, aby „połączyć” tabele w swoim modelu. Wszelkie zmiany biznesowe NIE będą miały wpływu na powiązane z tymi tabelami.
źródło
Prawdziwe pytanie brzmi, czy wydajność zapytania DB jest w ogóle znacząca dla twojej aplikacji (rozmiar danych). Jeśli twoje zapytanie zajmuje mikrosekundy, zaoszczędzenie kilku z tych mikrosekund za pomocą
Int
kluczy nie jest warte kary za czytelność / konserwację. Jeśli jednak zapytanie zajmuje kilka minut, zapisanie tych minut może być warte bóluInt
.Oto dlaczego myślę, że liczby całkowite mogą zaoszczędzić czas zapytania (jako procent całkowitego czasu zapytania), ale założyciele SkySpark potrafią to lepiej wyjaśnić niż ja . Po pełnym ujawnieniu, mój pracodawca płaci SkySpark dużo pieniędzy za korzystanie z ich DB, a ja próbuję zbudować coś lepszego / szybszego.
Jeśli masz dużo danych sekwencyjnych (pliki dziennika, szeregi czasowe, analizy, korpusy tekstowe lub mowy), które mają linki (relacje) do dowolnej z twoich tabel odnośników, przekonasz się, że przestrzeń dyskowa ma kluczowe znaczenie dla szybkości zapytań, pomimo @ Prawidłowa analiza Ballsuna-Stantona dotycząca tego, jak tania przestrzeń jest w $. Ponieważ większość czasu zapytania (w przypadku danych sekwencyjnych) spędza się na czytaniu dysku, miejsce nie jest tanie pod względem czasu (jako procent całkowitego czasu zapytania). Tak więc, chyba że RDB automatycznie i skutecznie kompresuje / dekompresuje wszystkie klucze obce (klucze do powiązanych rekordów), będziesz chciał, aby wszystkie klucze
Int
były najbardziej wydajne pod względem miejsca na dysku (i prędkości odczytu) na jednostkę informacji treść (entropia). FYI MyISAM w MySql nakłada ograniczeniana temat tego, co możesz zrobić ze skompresowanymi wierszami danych (tylko do odczytu). Innymi słowy, automatycznie zwiększane liczby całkowite są już kompresowane w stopniu, w jakim jest to teoretycznie możliwe , biorąc pod uwagę małe minimalne ograniczenie wielkości w większości pól liczb całkowitych DB. Kompresja jest dostępna bez:Istnieje powód, dla którego popularne, wydajne ORM, takie jak Django, domyślnie automatycznie zwiększają liczby całkowite dla PK i dlaczego inne pytania SO doszły do tego samego wniosku.
źródło