2009-08-22 14 views
17

Niedawno zacząłem rozwijać moją pierwszą poważną aplikację, która używa bazy danych SQL, i używam phpMyAdmin do konfiguracji tabel. Istnieje kilka opcjonalnych "funkcje" Mogę dać różne kolumny, a ja nie jestem do końca pewien, co robią:SQL: co dokładnie robią klucze podstawowe i indeksy?

  • Primary Key
  • Index

wiem, co jest dla PK i jak z niego korzystać, ale myślę, że moje pytanie w odniesieniu do tego, dlaczego jeden jest potrzebny - w jaki sposób różni się od zwykłego ustawienia kolumny "Unique", inne niż fakt, że można mieć tylko jeden PK? Czy programista wie, że ta wartość jednoznacznie identyfikuje rekord? Czy też ma jakieś specjalne właściwości?

Nie mam pojęcia, co robi "Indeks" - w rzeczywistości jedyne, jakie kiedykolwiek widziałem, to: (1) moje klucze podstawowe wydają się być indeksowane i (2) słyszałem, że indeksowanie jest w jakiś sposób związane z wydajnością; że chcesz indeksować kolumny, ale nie za dużo. W jaki sposób można zdecydować, które kolumny mają być indeksowane i co dokładnie to robi?

edytuj: powinien jeden indeks colums, który prawdopodobnie będzie chciał zamówić?

Dzięki dużo,

Mala

Odpowiedz

25

Klucz podstawowy jest zwykle wykorzystywane do tworzenia numerycznego 'identyfikator' dla dokumentacji, a ta kolumna jest automatycznie zwiększane id.

Na przykład, jeśli masz books tabeli z id pola, gdzie id jest kluczem podstawowym i jest ustawiony na auto_increment (Under „Ekstra w phpMyAdmin), a następnie, gdy najpierw dodać książkę do stołu, id dla tego będzie 1 '. Identyfikatorem następnej książki będzie automatycznie "2" i tak dalej. Zwykle każda tabela powinna zawierać co najmniej jeden klucz podstawowy, ułatwiający identyfikację i znajdowanie zapisów.

Indeksy są używane, gdy trzeba regularnie pobierać określone informacje z tabeli. Na przykład, jeśli masz tabelę users, a będziesz musiał często uzyskać dostęp do kolumny email, możesz dodać indeks do wiadomości e-mail, a to spowoduje, że zapytania uzyskujące dostęp do wiadomości e-mail będą szybsze.

Istnieją jednak również wady do dodawania niepotrzebnych indeksów, więc dodaj to tylko w kolumnach, które naprawdę muszą być dostępne częściej niż pozostałe. Na przykład zapytania o numerach: UPDATE, DELETE i INSERT będą nieco wolniejsze, im więcej indeksów masz, ponieważ MySQL musi przechowywać dodatkowe informacje dla każdej indeksowanej kolumny. Więcej informacji można znaleźć pod adresem this page.

Edytuj: Tak, kolumny, które muszą być użyte w ORDER BY, powinny mieć indeksy, a także te używane w WHERE.

+2

dziękuję, byłeś bardzo pomocny! Zastanawiam się jednak, czy ustawienie kolumny jako PK różni się od ustawiania kolumny jako unikalnej liczby całkowitej, która automatycznie się powiększa? Czy robi coś jeszcze pod maską? – Mala

+1

Edytowałem, aby odpowiedzieć na Twoje pytanie dotyczące wad indeksów. Klucze podstawowe również działają jako indeksy, więc jeśli masz PK w kolumnie, wszystkie zapytania SELECT lub ORDER BY na podstawie tego identyfikatora będą szybsze. Zapewniamy również, że każdy "identyfikator" jest unikalny, dlatego nie będziesz mieć duplikatów identyfikatorów takich jak Ty, jeśli masz właśnie aktualizowaną kolumnę INT. –

+3

Klucz podstawowy nie musi być wartością numeryczną ani pojedynczym polem. a kolumna IDENTYFIKACJA lepiej pasowałaby do tego opisu. Zamiast tego klucz podstawowy służy do informowania RDBMS, że określone pola mogą jednoznacznie identyfikować pojedynczy wiersz w tabeli. Zasadniczo UNIKALNY INDEKS. Jest to normalne (ale nie wymagane), aby Klucze Główne były również czynnikiem kontrolującym przechowywanie danych o kolejności (klucz podstawowy kluczem w SQLServer), a więc znacznie poprawiają czas potrzebny na znalezienie wierszy danych (do odczytu, zapisu, cokolwiek) – MatBailie

7

Klucz podstawowy to w zasadzie unikalna, zindeksowana kolumna, która działa jako "oficjalny" identyfikator wierszy w tej tabeli. Co najważniejsze, jest on zwykle używany do relacji klucza obcego, tj. Jeśli inna tabela odnosi się do wiersza w pierwszym, będzie zawierać kopię klucza podstawowego tego wiersza.

Należy zauważyć, że można mieć złożony klucz podstawowy, tj. Taki, który składa się z więcej niż jednej kolumny.

Indeksy poprawiają czasy wyszukiwania. Zwykle są one oparte na drzewach, więc wyszukiwanie określonego wiersza za pośrednictwem indeksu zajmuje czas O (log (n)), a nie skanowanie całej tabeli.

Ogólnie każda kolumna w dużej tabeli, która jest często używana w klauzulach WHERE, ORDER BY lub (szczególnie) JOIN powinna mieć indeks. Ponieważ indeks musi być aktualizowany dla każdego INSERT, UPDATE lub DELETE, spowalnia te operacje. Jeśli masz kilka zapisów i dużo czytasz, zindeksuj treść swoich słuchaczy. Jeśli masz wiele zapisów i wiele zapytań wymagających indeksów w wielu kolumnach, masz duży problem.

6

Różnicę między kluczem podstawowym a kluczem unikatowym najlepiej wyjaśnić na przykładzie.

Mamy tabelę użytkowników:

USER_ID number 
NAME varchar(30) 
EMAIL varchar(50) 

W tym stole USER_ID jest kluczem podstawowym. NAZWA nie jest wyjątkowa - na świecie jest wielu Johna Smithów i Muhammedów Khanów. EMAIL jest z konieczności wyjątkowy, w przeciwnym razie światowy system poczty e-mail nie działałby. Dlatego nakładamy wyjątkowe ograniczenie na EMAIL.

Dlaczego potrzebujemy oddzielnego klucza podstawowego? Trzy powody:

  1. klawisz numeryczny jest bardziej wydajny stosowany w obcych kluczowych relacji ponieważ zajmuje mniej miejsca
  2. e-mail można zmienić (np dostawcze zamiana), ale użytkownik jest wciąż ten sam ; falujący zmianę wartości klucza podstawowego w całym schemacie zawsze jest koszmar
  3. zawsze jest to zły pomysł, aby użyć poufnych lub prywatnych informacji, jak klucz obcy
3

W modelu relacyjnego, każdy kolumna lub zestaw kolumn, które są zarówno obecne, jak i unikalne w tabeli, można nazwać kandydującym kluczem do tabeli. "Present" oznacza "NOT NULL". Powszechną praktyką w projektowaniu baz danych jest oznaczanie jednego z kluczy kandydujących jako klucza podstawowego i używanie odniesień do klucza podstawowego w odniesieniu do całego wiersza lub do tematu będącego przedmiotem opisywanego wiersza.

W języku SQL ograniczenie PRIMARY KEY oznacza ograniczenie NIE NULL dla każdej kolumny klucza podstawowego i ograniczenie UNIQUE dla wszystkich kolumn klucza podstawowego razem wziętych. W praktyce wiele kluczy podstawowych okazuje się być pojedynczymi kolumnami.

W przypadku większości produktów DBMS ograniczenie PODSTAWOWE KLUCZA spowoduje również automatyczne utworzenie indeksu na kolumnach kluczy podstawowych. Przyspiesza to działanie sprawdzania systemów, gdy wprowadzane są nowe wpisy dla klucza podstawowego, aby upewnić się, że nowa wartość nie powiela istniejącej wartości. Przyspiesza również wyszukiwanie na podstawie wartości klucza podstawowego i łączy klucz podstawowy z kluczem obcym, który się do niego odwołuje. Przyspieszenie zależy od tego, jak działa optymalizator zapytań.

Pierwotnie projektanci relacyjnych baz danych poszukiwali naturalnych kluczy w podanych danych. W ostatnich latach tendencja polegała na tym, aby zawsze tworzyć kolumnę o nazwie ID, liczbę całkowitą jako pierwszą kolumnę i klucz podstawowy każdej tabeli. Funkcja autogeneracji systemu DBMS jest używana w celu zapewnienia unikalności tego klucza. Ta tendencja jest udokumentowana w "standardach projektowych Oslo".Niekoniecznie jest to projektowanie relacyjne, ale zaspokaja niektóre bezpośrednie potrzeby ludzi, którzy go przestrzegają. Nie polecam tej praktyki, ale zdaję sobie sprawę, że jest to powszechna praktyka.

Indeks jest strukturą danych, która umożliwia szybki dostęp do kilku wierszy w tabeli, w oparciu o opis kolumn indeksowanych tabeli. Indeks składa się z kopii niektórych kolumn tabeli, nazywanych kluczami indeksu, przeplatanych wskaźnikami do wierszy tabeli. Wskaźniki są ogólnie ukryte przed użytkownikami DBMS. Indeksy działają w parze z optymalizatorem zapytań. Użytkownik określa w SQL, jakie dane są poszukiwane, a optymalizator wymyśla strategie indeksowania i inne strategie tłumaczenia tego, co jest poszukiwane, na strategię wyszukiwania. Istnieje pewna zasada organizacyjna, taka jak sortowanie lub mieszanie, która umożliwia użycie indeksu do szybkiego wyszukiwania i niektórych innych zastosowań. To wszystko jest wewnętrzne dla DBMS, gdy twórca baz danych utworzył indeks lub zadeklarował klucz podstawowy.

Można tworzyć indeksy, które nie mają nic wspólnego z kluczem podstawowym. Klucz podstawowy może istnieć bez indeksu, chociaż generalnie jest to bardzo zły pomysł.

+0

(jeśli nadal jesteś w pobliżu) = Ciekawi mnie, dlaczego nie zaleca się konfigurowania kolumny całkowitej jako klucza podstawowego. Uczyniłem to regularną praktyką w moim rozwoju SQL i odkryłem, że sprawia, że ​​wybieranie, aktualizowanie, wstawianie i usuwanie ze skryptów PHP (jak również ustalanie relacji między tabelami i tworzenie połączeń) jest o wiele prostsze niż poleganie na naturalnych PK pochodzących od dane. – Vega

+0

To kwestia sporna, ponieważ mój widok jest widokiem mniejszości. –

Powiązane problemy