Ако вашите данни са уникални, трябва да създадете 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
) и листата са подредени по тези указатели, така че всъщност всеки индексен лист е уникален по някакъв начин (макар че може да не е очевиден).
Вижте тази статия в моя блог за подробности за ефективността: