UNIQUE i PRIMARY KEY to ograniczenia , a nie indeksy. Chociaż większość baz danych implementuje te ograniczenia za pomocą indeksu. Dodatkowy narzut związany z ograniczeniem oprócz indeksu jest nieistotny, zwłaszcza gdy policzysz koszt śledzenia i korygowania niezamierzonych duplikatów, gdy (nie jeśli) wystąpią.
Indeksy są zwykle bardziej efektywne, jeśli masz wysoką selektywność . Jest to stosunek liczby odrębnych wartości do łącznej liczby wierszy.
Na przykład w kolumnie Numer ubezpieczenia społecznego możesz mieć 1 milion wierszy z 1 milionem odrębnych wartości. Tak więc selektywność wynosi 1000000/1000000 =1,0 (chociaż istnieją rzadkie wyjątki historyczne, numery SSN mają być unikatowe).
Ale inna kolumna w tej tabeli, „płeć” może mieć tylko dwie różne wartości w 1 milionie wierszy. 2/1000000 =bardzo niska selektywność.
Indeks z ograniczeniem UNIQUE lub PRIMARY KEY gwarantuje selektywność 1,0, więc zawsze będzie tak skuteczny, jak tylko może być indeks.
Pytałeś o różnicę między kluczem podstawowym a ograniczeniem przez unikalność. Przede wszystkim jest to, że możesz mieć tylko jedno ograniczenie klucza podstawowego na tabelę (nawet jeśli definicja tego ograniczenia zawiera wiele kolumn), podczas gdy możesz mieć wiele unikalnych ograniczeń. Kolumna z ograniczeniem przez unikalność może zezwalać na wartości NULL, podczas gdy kolumny z ograniczeniami klucza podstawowego nie mogą zezwalać na wartości NULL. Poza tym klucz podstawowy i unikalny są bardzo podobne pod względem implementacji i zastosowania.
Pytałeś w komentarzu, czy używać MyISAM czy InnoDB. W MySQL używają terminu silnik pamięci . Istnieje kilka subtelnych różnic między tymi dwoma silnikami pamięci masowej, ale główne z nich to:
- InnoDB obsługuje transakcje, więc możesz wycofać lub zatwierdzić zmiany. MyISAM skutecznie zawsze automatycznie zatwierdza.
- InnoDB wymusza ograniczenia klucza obcego. MyISAM nie wymusza ani nawet nie przechowuje ograniczeń kluczy obcych.
Jeśli te funkcje są rzeczami, których potrzebujesz w swojej aplikacji, powinieneś użyć InnoDB.
Odpowiadanie na Twój komentarz nie jest takie proste. InnoDB jest faktycznie szybszy niż MyISAM w wielu przypadkach, więc zależy to od kombinacji wyborów, aktualizacji, współbieżnych zapytań, indeksów, konfiguracji buforów itp. w Twojej aplikacji.
Zobacz http:// /www.mysqlperformanceblog.com/2007/01/08/innodb-vs-myisam-vs-falcon-benchmarks-part-1/ dla bardzo dokładnego porównania wydajności silników pamięci masowej. InnoDB wygrywa z MyISAM na tyle często, że wyraźnie nie można powiedzieć, że jedno jest szybsze od drugiego.
Podobnie jak w przypadku większości pytań związanych z wydajnością, jedyny sposób, aby na nie odpowiedzieć w przypadku Twojej aplikacji jest przetestowanie obu konfiguracji przy użyciu aplikacji i reprezentatywnej próbki danych oraz zmierzenie wyników.