在PostgreSQL中优化对连接的firstname和lastname的搜索

时间:2015-08-05 07:28:03

标签: postgresql sql-optimization

我在Postgres中编写了一个SQL查询,它通过firstname和lastname搜索用户。我的问题很简单,如果它可以被优化,因为它会被大量使用。

CREATE INDEX users_firstname_special_idx ON users(firstname text_pattern_ops);
CREATE INDEX users_lastname_special_idx ON users(lastname text_pattern_ops);

SELECT id, firstname, lastname FROM users WHERE firstname || ' ' || lastname ILIKE ('%' || 'sen' || '%') LIMIT 25;

如果我进行解释,我会得到以下输出:

Limit  (cost=0.00..1.05 rows=1 width=68)
  ->  Seq Scan on users  (cost=0.00..1.05 rows=1 width=68)
        Filter: (((firstname || ' '::text) || lastname) ~~* '%sen%'::text)

据我所知,我应该尝试使postgrep跳过"过滤器:" -thing。这是对的吗?

希望你们有任何建议。

干杯。

2 个答案:

答案 0 :(得分:2)

如果字符串中包含多个%个通配符,则需要使用trigram index

但是,在你的情况下,你正在做一些奇怪的事情。您连接firstnamelastname,中间有一个空格。因此,firstnamelastname中的搜索字符串'%sen%'仅 ,并且从不包含空格。因此,更好的解决方案是:

CREATE INDEX users_firstname_special_idx ON users USING gist (firstname gist_trgm_ops);
CREATE INDEX users_lastname_special_idx ON users USING gist (lastname gist_trgm_ops);

SELECT id, firstname || ' ' || lastname AS fullname
FROM users
WHERE firstname ILIKE ('%sen%') OR lastname ILIKE ('%sen%')
LIMIT 25;

答案 1 :(得分:1)

您完全根据PostgreSQL文档描述了情况:

Indexes on Expressions