Jeśli Twoje dane są unikalne, powinieneś utworzyć UNIKALNY
indeksuj je.
Nie oznacza to żadnych dodatkowych narzutów i wpływa na decyzje optymalizatora w niektórych przypadkach, dzięki czemu może on wybrać lepszy algorytm.
W SQL Server
oraz w PostgreSQL
, na przykład, jeśli sortujesz według UNIKALNEGO
klucz, optymalizator ignoruje ORDER BY
klauzule użyte po tym (ponieważ są nieistotne), ja. mi. to zapytanie:
SELECT *
FROM mytable
ORDER BY
col_unique, other_col
LIMIT 10
użyje indeksu na col_unique
i nie będzie sortować według other_col
ponieważ jest bezużyteczny.
To zapytanie:
SELECT *
FROM mytable
WHERE mycol IN
(
SELECT othercol
FROM othertable
)
zostanie również przekonwertowany na INNER JOIN
(w przeciwieństwie do SEMI JOIN
) jeśli istnieje UNIKALNY
indeks na othertable.othercol
.
Indeks zawsze zawiera jakiś wskaźnik do wiersza (ctid
w PostgreSQL
, wskaźnik wiersza w MyISAM
, klucz podstawowy/unikyfikator w InnoDB
), a liście są uporządkowane według tych wskaźników, więc w rzeczywistości każdy liść indeksu jest w jakiś sposób unikalny (choć może to nie być oczywiste).
Zobacz ten artykuł na moim blogu, aby uzyskać szczegółowe informacje na temat wydajności: