4

複数のユーザー アカウントの連絡先情報テーブル (名、姓) を格納する PostgreSQL データベースがあります。各連絡先の行には、ユーザー ID 列があります。ユーザーが連絡先の姓または名の最初の数文字を検索できるようにインデックスを設定するには、どのような方法が最も効果的でしょうか?

従来の B ツリー インデックス作成と PG 固有の GIN および GiST については認識していますが、連絡先が少ないユーザーが検索する必要がないように、それらがどのように連携できるか (またはできないか) はわかりません。 user_id でフィルタリングする前のすべての連絡先。

4

1 に答える 1

2

作成するインデックスの最初の列としてアカウント識別子を追加する必要があります。これにより、最初にそのアカウントに属する行に検索が絞り込まれます。gistまたはginフルテキストインデックスの場合、btree_gistまたはbtree_gin拡張機能をインストールする必要があります。

最初の文字だけを検索する必要がある場合、最も簡単でおそらく最も速いのは、両方の列のテキスト操作をサポートする通常のbtreeを使用し、2回の検索を行うことです。text_pattern_ops opclassを使用してテキストプレフィックスクエリをサポートし、大文字と小文字を区別しないようにフィールドをlower()する必要があります。

CREATE INDEX contacts_firstname_idx ON contacts(aid, lower(firstname) text_pattern_ops);
CREATE INDEX contacts_lastname_idx ON contacts(aid, lower(lastname) text_pattern_ops);

クエリは次のようになります。

SELECT * FROM contacts WHERE aid = 123 AND
    (lower(firstname) LIKE 'an%' OR lower(lastname) LIKE 'an%')
于 2012-09-19T01:24:35.340 に答える