Klucze podstawowe znak a liczba całkowita

30

Projektuję bazę danych z wieloma tabelami wyszukiwania zawierającymi możliwe atrybuty głównych jednostek. Zastanawiam się nad użyciem klucza 4 lub 5-znakowego do identyfikacji tych wartości wyszukiwania zamiast liczby całkowitej z auto-inkrementacją, aby podczas przechowywania tych identyfikatorów atrybutów w głównych tabelach widziałem wartości znaczące, a nie tylko liczby losowe.

Jakie są konsekwencje dla wydajności używania pola znaków jako klucza podstawowego zamiast liczby całkowitej?

Używam MySQL, jeśli to ma znaczenie.

[Edytuj] W
tych tabelach wyszukiwania rzadko dodawane są nowe rekordy. Są one obsługiwane ręcznie, a klucze oparte na znakach są również tworzone ręcznie. Oto przykład:

      CUISINES
 ID      Description
-----  --------------
CHNSE  Chinese
ITALN  Italian
MXICN  Mexican
BenV
źródło

Odpowiedzi:

22

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 foow 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.

Brian Ballsun-Stanton
źródło
@ BrianBallsun-Stanton, jeśli masz jakieś obszerne sekwencyjne dane, które odnoszą się do tych tabel odnośników, przestrzeń dyskowa nie jest tania (pod względem szybkości zapytań), ponieważ szybkość odczytu dysku jest wąskim gardłem w każdym RDB, którego nie można buforować całkowicie w pamięci RAM. Znalazłem to, próbując opracować schemat RDB, który może konkurować z najlepszymi w biznesie DB z szeregów czasowych. Pełne ujawnienie, nie mam związku z Skyspark, z wyjątkiem tego, że obciążają mojego pracodawcę za korzystanie z ich bardzo wydajnego DB.
płyty kuchenne
8

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.

garik
źródło
3

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ą Intkluczy nie jest warte kary za czytelność / konserwację. Jeśli jednak zapytanie zajmuje kilka minut, zapisanie tych minut może być warte bólu Int.

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 Intbył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:

  1. kara za kompresję / dekompresję w czasie zapytania
  2. kara za odczyt dysku w czasie zapytania
  3. tylko do odczytu lub inne ograniczenia DB dotyczące skompresowanych rekordów danych lub kluczy

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.

płyty grzewcze
źródło