PostgreSQL 中名字和姓氏串联搜索的优化

Cyb*_*urk 4 postgresql sql-optimization

我在 Postgres 中编写了一个 SQL 查询,它可以按名字和姓氏搜索用户。我的问题很简单,它是否可以优化,因为它会被大量使用。

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;
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

据我了解,我应该尝试让 postgrep 跳过“Filter:”-东西。那是对的吗?

希望大家有什么建议。

干杯。

Pat*_*ick 9

如果字符串中有超过 1 个%通配符,则需要使用trigram索引

然而,就你而言,你正在做一些奇怪的事情。您可以连接firstnamelastname,中间有一个空格。因此,搜索字符串“%sen%”出现在 thefirstname或 the中lastname,并且从不包含空格。因此,更好的解决方案是:

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;
Run Code Online (Sandbox Code Playgroud)