データが一意である場合は、UNIQUEを作成する必要があります それらのインデックス。
これは、追加のオーバーヘッドがないことを意味し、特定の場合にオプティマイザーの決定に影響を与えるため、より適切なアルゴリズムを選択できます。
SQL Server内 およびPostgreSQL たとえば、UNIQUEで並べ替える場合 キーを押すと、オプティマイザーはORDER BYを無視します その後に使用される句(関連性がないため)、i。 e。このクエリ:
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とは対照的 )UNIQUEがある場合 othertable.othercolのインデックス 。
インデックスには、常に行へのある種のポインタが含まれています(ctid PostgreSQLで 、MyISAMの行ポインタ 、InnoDBの主キー/一意化子 )そしてリーフはこれらのポインタ上で順序付けられているので、実際にはすべてのインデックスリーフは何らかの方法で一意です(明確ではないかもしれませんが)。
パフォーマンスの詳細については、ブログのこの記事を参照してください: