8

鉴于此表:

foos
integer id
string name
string type

和这样的查询:

select * from foos where name ilike '%bar%'

我可以像这样创建一个pg_trgm 索引来加快查找速度:

CREATE INDEX ON foos USING gin (name gin_trgm_ops)

(对?)

我的问题:这样的查询怎么样:

select * from foos where name ilike '%bar%' AND type = 'baz'

我可以创建一个有助于查找两列的索引吗?

(我知道 trigram 并不是严格意义上的全文,但无论如何我都在标记这个问题)

4

2 回答 2

9

您可以使用组合不同类型的多列索引。

首先,添加您的案例所需的两个扩展:

CREATE EXTENSION pg_trgm;
CREATE EXTENSION btree_gist;

pg_trgm允许您使用 trigram 索引,而btree_gist允许您组合gistb-tree索引,这就是您想要的!

对于像这样的查询:

SELECT * FROM foo WHERE type = 'baz' AND name ilike '%bar%';

您现在可以创建如下索引:

CREATE INDEX ON foo USING gist (type, name gist_trgm_ops);

像往常一样,查询和索引之间的列顺序必须相同。

于 2015-04-02T13:41:51.277 回答
0

使用复合索引:

CREATE INDEX ON foos(name, type)

但是,您可能想要:

CREATE INDEX ON foos(lower(name), type)

我不明白为什么您的查询需要全文索引。

于 2014-02-05T22:03:03.470 回答