web-dev-qa-db-ja.com

文字列列のpostgresqlインデックス

たとえば、ResidentInfoというテーブルがあり、このテーブルにはHomeAddressタイプである一意の制約VARCHARがあります。将来のクエリのために、この列にインデックスを追加します。クエリには=操作のみが含まれます。現在、ハッシュパターンは推奨されていないため、B-TREEパターンを使用します。

質問:効率の観点から、B-TREEを使用して、異なるホームアドレスに対応する番号1,2,3 ....、Nを含む新しい列を追加し、代わりにHomeAddressにインデックスを追加する必要があると思いますか、数値列にインデックスを追加する必要がありますか?

インデックスの仕組みがわからないので、この質問をします。

22
Hao

単純な等価性チェック(=)の場合、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には多くのオプションがありますが、この単純なケースではもう必要ありません。

33

Postgresでは、フィールドに一意のインデックスを維持することで一意の制約が適用されるため、すでに説明しました。

住所の一意の制約が悪いと判断した場合(正直なところ、配偶者は別のアカウントを作成していますか?

create index on ResidentInfo (HomeAddress);
8