たとえば、ResidentInfo
というテーブルがあり、このテーブルにはHomeAddress
タイプである一意の制約VARCHAR
があります。将来のクエリのために、この列にインデックスを追加します。クエリには=
操作のみが含まれます。現在、ハッシュパターンは推奨されていないため、B-TREEパターンを使用します。
質問:効率の観点から、B-TREEを使用して、異なるホームアドレスに対応する番号1,2,3 ....、Nを含む新しい列を追加し、代わりにHomeAddress
にインデックスを追加する必要があると思いますか、数値列にインデックスを追加する必要がありますか?
インデックスの仕組みがわからないので、この質問をします。
単純な等価性チェック(=
)の場合、varchar
またはtext
列のBツリーインデックスは単純であり、最良の選択です。これは確かにパフォーマンスに非常に役立ちます。
もちろん、単純なinteger
のBツリーインデックスの方がパフォーマンスが良くなります。手始めに、単純なinteger
値の比較は少し高速です。しかし、もっと重要なことは、パフォーマンスもインデックスのサイズの関数です。列が大きいほど、データページあたりの行数が少なくなり、より多くのページを読み取る必要があります...
とにかくHomeAddress
はほとんど一意ではないため、自然な主キーではありません。代わりに代理主キーを使用することを強くお勧めします。 serial
column はそのための明らかな選択です。その唯一の目的は、シンプルで高速な主キーを使用することです。
上記のテーブルを参照する他のテーブルがある場合、これはさらに効率的になります。外部キー列に長い文字列を複製する代わりに、整数列に必要なのは4バイトだけです。また、アドレスを変更する必要があるため、更新をカスケードする必要はありませんが、サロゲートpkは同じままでかまいません(もちろんそうする必要はありません)。
テーブルは次のようになります。
CREATE TABLE resident (
resident_id serial PRIMARY KEY
,address text NOT NULL
-- more columns
);
CREATE INDEX resident_adr_idx ON resident(address);
これにより、2つのBツリーインデックスが作成されます。 resident_id
の一意のインデックスとaddress
のプレーンインデックス。
マニュアルのインデックスの詳細 。
Postgresには多くのオプションがありますが、この単純なケースではもう必要ありません。
Postgresでは、フィールドに一意のインデックスを維持することで一意の制約が適用されるため、すでに説明しました。
住所の一意の制約が悪いと判断した場合(正直なところ、配偶者は別のアカウントを作成していますか?
create index on ResidentInfo (HomeAddress);