データが一意である場合は、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
の主キー/一意化子 )そしてリーフはこれらのポインタ上で順序付けられているので、実際にはすべてのインデックスリーフは何らかの方法で一意です(明確ではないかもしれませんが)。
パフォーマンスの詳細については、ブログのこの記事を参照してください: