【发布时间】:2015-08-05 07:28:02
【问题描述】:
我在 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;
如果我运行解释,我会得到以下输出:
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。对吗?
希望大家有什么建议。
干杯。
【问题讨论】:
-
不要连接两个名称元素,单独过滤它们,也不要使用双端通配符。如果以这种方式过滤,无论创建多少索引,它们都将无法使用。
-
你检查过postgres全文搜索吗?
-
是的,但老实说,我发现文本搜索有点“令人困惑”。我现在尝试了几种方法,但我似乎无法让搜索使用索引,除非我使用一列连接名称创建一个物化视图并在该列上放置一个索引。然而,这并不聪明,因为我需要经常刷新视图,并且我希望表格有几千行。
标签: postgresql sql-optimization