Se i tuoi dati sono univoci, dovresti creare un UNIQUE
indice su di essi.
Ciò non implica alcun sovraccarico aggiuntivo e in alcuni casi influisce sulle decisioni dell'ottimizzatore in modo che possa scegliere un algoritmo migliore.
In SQL Server
e in PostgreSQL
, ad esempio, se ordini su un UNIQUE
chiave, l'ottimizzatore ignora il ORDER BY
clausole utilizzate successivamente (poiché irrilevanti), i. e. questa domanda:
SELECT *
FROM mytable
ORDER BY
col_unique, other_col
LIMIT 10
utilizzerà un indice su col_unique
e non ordinerà su other_col
perché è inutile.
Questa domanda:
SELECT *
FROM mytable
WHERE mycol IN
(
SELECT othercol
FROM othertable
)
verrà anche convertito in un INNER JOIN
(al contrario di un SEMI JOIN
) se è presente un UNIQUE
indice su othertable.othercol
.
Un indice contiene sempre una sorta di puntatore alla riga (ctid
in PostgreSQL
, puntatore di riga in MyISAM
, chiave primaria/unificatore in InnoDB
) e le foglie sono ordinate su questi puntatori, quindi in effetti ogni foglia dell'indice è unica in qualche modo (anche se potrebbe non essere ovvio).
Vedi questo articolo nel mio blog per i dettagli sulle prestazioni: