4

我有一个 PostgreSQL 数据库,用于存储多个用户帐户的联系信息表(名字、姓氏)。每个联系人行都有一个用户 ID 列。建立索引以便用户可以搜索其联系人的名字或姓氏的前几个字母的最高效的方法是什么?

我知道传统的 b-tree 索引和特定于 PG 的 GIN 和 GiST,但我只是不确定它们如何(或不能)一起工作,以便只有几个联系人的用户不必搜索通过 user_id 过滤之前的所有联系人。

4

1 回答 1

2

您应该将帐户标识符添加为您创建的任何索引的第一列。这实际上将首先将搜索范围缩小到属于该帐户的行。对于 gist 或 gin 全文索引,您需要安装 btree_gist 或 btree_gin 扩展。

如果您只需要搜索第一个字母,最简单且可能最快的方法是使用支持两列文本操作并进行 2 次查找的常规 btree。您需要使用 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 回答