小编pan*_*ari的帖子

添加订单子句时不使用 GIN 索引

我正在尝试加速执行三个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)

postgresql index full-text-search

6
推荐指数
1
解决办法
2091
查看次数

标签 统计

full-text-search ×1

index ×1

postgresql ×1