我正在尝试加速执行三个ILIKE
查询的查询并使用 or 减少这些查询(返回总计数和 10 个条目)
SELECT *, count(*) OVER() as filtered_count FROM "users"
WHERE (
(f_unaccent("users"."first_name") ILIKE f_unaccent('%foo%') OR
f_unaccent("users"."last_name") ILIKE f_unaccent('%foo%')) OR
f_unaccent("users"."club_or_hometown") ILIKE f_unaccent('%foo%')
) LIMIT 10 OFFSET 0
Run Code Online (Sandbox Code Playgroud)
在为所有查询的属性添加 gin-indexes 后,这工作得相当快(这里仅适用于 first_name):
CREATE INDEX users_first_name_gin
ON users
USING gin
(f_unaccent(first_name::text) COLLATE pg_catalog."default" gin_trgm_ops);
Run Code Online (Sandbox Code Playgroud)
然而,如果我添加一个额外的 order 子句,例如ORDER BY users.first_name ASC
,postgresql 不使用 gin 索引,而是使用正常的 b-tree 索引 on first_name
,然后过滤结果。这在我的应用程序中需要更长的时间。即使对于有序查询,我如何调整查询/索引以继续使用 gin 索引?
编辑:我使用的是 postgresql 9.4
无序查询的解释:
"Limit (cost=125.98..139.61 rows=10 width=58) (actual time=17.828..17.833 rows=10 loops=1)"
" -> …
Run Code Online (Sandbox Code Playgroud)