Ако вашите данни са уникални, трябва да създадете UNIQUE индекс върху тях.
Това не предполага допълнителни разходи и засяга решенията на оптимизатора в определени случаи, така че той да може да избере по-добър алгоритъм.
В SQL сървър и в PostgreSQL , например, ако сортирате по УНИКАЛЕН ключ, оптимизаторът игнорира ORDER BY клаузи, използвани след това (тъй като са ирелевантни), т.е. д. тази заявка:
SELECT *
FROM mytable
ORDER BY
col_unique, other_col
LIMIT 10
ще използва индекс на col_unique и няма да сортира по other_col защото е безполезно.
Тази заявка:
SELECT *
FROM mytable
WHERE mycol IN
(
SELECT othercol
FROM othertable
)
също ще се преобразува в INNER JOIN (за разлика от SEMI JOIN ), ако има УНИКАЛЕН индекс на othertable.othercol .
Индексът винаги съдържа някакъв вид указател към реда (ctid в PostgreSQL , указател на ред в MyISAM , първичен ключ/унификатор в InnoDB ) и листата са подредени по тези указатели, така че всъщност всеки индексен лист е уникален по някакъв начин (макар че може да не е очевиден).
Вижте тази статия в моя блог за подробности за ефективността: