Si vos données sont uniques, vous devez créer un UNIQUE
indexez-les.
Cela n'implique aucune surcharge supplémentaire et affecte les décisions de l'optimiseur dans certains cas afin qu'il puisse choisir un meilleur algorithme.
Dans SQL Server
et dans PostgreSQL
, par exemple, si vous triez sur un UNIQUE
clé, l'optimiseur ignore le ORDER BY
les clauses utilisées par la suite (puisqu'elles ne sont pas pertinentes), i. e. cette requête :
SELECT *
FROM mytable
ORDER BY
col_unique, other_col
LIMIT 10
utilisera un index sur col_unique
et ne triera pas sur other_col
parce que c'est inutile.
Cette requête :
SELECT *
FROM mytable
WHERE mycol IN
(
SELECT othercol
FROM othertable
)
sera également converti en un INNER JOIN
(par opposition à un SEMI JOIN
) s'il y a un UNIQUE
index sur othertable.othercol
.
Un index contient toujours une sorte de pointeur vers la ligne (ctid
dans PostgreSQL
, pointeur de ligne dans MyISAM
, clé primaire/uniquificateur dans InnoDB
) et les feuilles sont ordonnées sur ces pointeurs, donc en fait chaque feuille d'index est unique d'une certaine manière (bien que ce ne soit pas évident).
Consultez cet article sur mon blog pour plus de détails sur les performances :