2009-08-18 5 views
17

Iは索引付けされた列を走査するときカラム検索のパフォーマンスが一意のインデックスより優れていますか? (PGSQL&MySQLの)

CREATE INDEX idx ON tbl (columns); 

CREATE UNIQUE INDEX idx ON tbl (columns); 

は、PostgreSQLやMySQL実装で重要アルゴリズムのパフォーマンス上の利点を有しているか否かの好奇心、又はUNIQUEキーワードがインデックスの横にユニーク制約を導入するかどうかを示します。

インデックスがある種のハッシュとして内部的に実装される可能性がある限り、おそらくは利益があると想像してください。のような構造であり、定義による衝突処理はO (1)パフォーマンス。この前提を考えると、価値の大部分が同一であれば構造は何かリニアに退化よりも可能性があります。

私の質問の目的のために、値の分布はで、比較的には離散的で均一であるとします。

ありがとうございます!私はRDBMの内部に精通していないよと、私のために純粋な投機の問題です

1。あなたのデータが一意である場合

答えて

15

は、あなたがそれらの上にUNIQUEインデックスを作成する必要があります。

これには追加のオーバーヘッドがないことを意味し、それがより良いアルゴリズムを選択できるように、特定のケースでは、オプティマイザの決定に影響を与えます。 SQL Server

、あなたがUNIQUEキーに並べ替える場合は(彼らは無関係であるため)PostgreSQLで、例えば、オプティマイザはその後に使用ORDER BY句を無視し、私は。 e。このクエリ:

SELECT * 
FROM mytable 
ORDER BY 
     col_unique, other_col 
LIMIT 10 

col_uniqueにインデックスを使用しますと、それは無用だからother_colに並べ替えません。

このクエリ:(SEMI JOINとは対照的に)othertable.othercolUNIQUE指標が存在する場合

SELECT * 
FROM mytable 
WHERE mycol IN 
     (
     SELECT othercol 
     FROM othertable 
     ) 

INNER JOINに変換されます。

は、インデックスは常に(InnoDBでは、主キー/ uniquifier MyISAMPostgreSQLctid、行ポインタ)行へのポインタのいくつかの種類が含まれており、実際には、すべてのインデックスのリーフがユニークであるので、葉は、これらのポインタで注文されています何らかの方法です(それは明白ではありませんが)。

パフォーマンスの詳細については、私のブログでこの記事を参照してください。

2

まあ、通常インデックスは、ハッシュBツリーではありません(そこにハッシュベースのインデックスがありますが、最も一般的な指標(少なくともPostgreSQLでは)Bツリーのベースです)。

speed-uniqueは高速でなければなりません。インデックススキャンで特定の値の行が見つかった場合、この値を持つ他の行があるかどうか検索する必要はなく、素早くスキャンを終了できます。

3

ユニーク制約があるため、更新/挿入操作中に小さなペナルティがあります。一意性制約が違反されていないことを確認するために、挿入/更新操作の前に検索する必要があります。

関連する問題