Pokud jsou vaše data jedinečná, měli byste vytvořit UNIQUE
index na nich.
To neznamená žádnou další režii a v určitých případech to ovlivňuje rozhodnutí optimalizátoru, aby mohl zvolit lepší algoritmus.
V SQL Server
a v PostgreSQL
, například pokud třídíte podle UNIQUE
klíč, optimalizátor ignoruje ORDER BY
doložky použité poté (protože jsou irelevantní), tzn. E. tento dotaz:
SELECT *
FROM mytable
ORDER BY
col_unique, other_col
LIMIT 10
použije index na col_unique
a nebude řadit podle other_col
protože je to zbytečné.
Tento dotaz:
SELECT *
FROM mytable
WHERE mycol IN
(
SELECT othercol
FROM othertable
)
bude také převeden na INNER JOIN
(na rozdíl od SEMI JOIN
), pokud existuje UNIQUE
index na othertable.othercol
.
Index vždy obsahuje nějaký druh ukazatele na řádek (ctid
v PostgreSQL
, ukazatel řádku v MyISAM
, primární klíč/uniquiifier v InnoDB
) a listy jsou seřazeny podle těchto ukazatelů, takže ve skutečnosti je každý indexový list svým způsobem jedinečný (i když to nemusí být zřejmé).
Podrobnosti o výkonu naleznete v tomto článku na mém blogu: