Als uw gegevens uniek zijn, moet u een UNIQUE
. maken index op hen.
Dit houdt geen extra overhead in en beïnvloedt in bepaalde gevallen de beslissingen van de optimizer, zodat deze een beter algoritme kan kiezen.
In SQL Server
en in PostgreSQL
, bijvoorbeeld als u sorteert op een UNIQUE
sleutel, negeert de optimizer de ORDER BY
clausules die daarna worden gebruikt (omdat ze niet relevant zijn), i. e. deze vraag:
SELECT *
FROM mytable
ORDER BY
col_unique, other_col
LIMIT 10
zal een index gebruiken op col_unique
en zal niet sorteren op other_col
omdat het nutteloos is.
Deze vraag:
SELECT *
FROM mytable
WHERE mycol IN
(
SELECT othercol
FROM othertable
)
wordt ook omgezet in een INNER JOIN
(in tegenstelling tot een SEMI JOIN
) als er een UNIQUE
. is index op othertable.othercol
.
Een index bevat altijd een soort aanwijzer naar de rij (ctid
in PostgreSQL
, rijaanwijzer in MyISAM
, primaire sleutel/uniquifier in InnoDB
) en de bladeren zijn geordend op deze wijzers, dus in feite is elk indexblad op de een of andere manier uniek (hoewel het misschien niet duidelijk is).
Zie dit artikel in mijn blog voor prestatiedetails: