Postgres 全文搜索 to_tsvector 不使用索引

问题描述 投票:0回答:1

查询与索引匹配,为什么对电影进行Seq Scan?它应该使用位图堆扫描。

psql (PostgreSQL) 15.4(自制)

索引:

​CREATE​ ​INDEX​ movies_title_searchable ​ON​ movies​ ​USING​ gin(to_tsvector(​'english'​, title));

查询:

EXPLAIN ANALYZE
SELECT title
FROM movies
WHERE to_tsvector('english', title) @@ to_tsquery('english', 'night & day') LIMIT 1;
->  Seq Scan on movies  (cost=0.00..2.31 rows=1 width=32) (actual time=0.035..0.035 rows=1 loops=1)
        Filter: (to_tsvector('english'::regconfig, title) @@ '''night'' & ''day'''::tsquery)
        Rows Removed by Filter: 3
postgresql full-text-search tsvector
1个回答
0
投票

显然,由于表大小(太小),postgres 不会使用索引。

查询规划器可能会确定从堆中直接读取比索引扫描的成本更可取,即使有可用的索引命中。如果索引扫描本身会返回表中的大部分数据,那么 Postgres 最常见的是选择此路径。因此,Postgres 经常跳过小表的索引。

© www.soinside.com 2019 - 2024. All rights reserved.